长话短说,我想针对该类测试android.os.Bundle类的克隆实现,以查看哪种更好。我已经知道我的版本很可能会更糟糕,但我想知道 有多少
糟糕。是否有适用于Android的基准测试工具,可以用来查看哪个对象的内存更大和/或需要更多的处理时间来存储/检索值?
TL; DR:
我查看了android.os.Bundle类的源代码,但我不喜欢它存储和返回对象的方式。它只是将它们存储在中HashMap<String, Object>
,然后使用ClassLoader
强制转换为所请求对象的类(如getString()
或getInt()
)。我觉得这或任何此类的类强制转换都违反了类型安全性,并在编程级别引入了歧义,这是静态类型旨在防止的,不是吗?
我想创建一个不违反类型安全且不引入歧义的类似数据容器类。逻辑上简单但显然效率低下的方法是为我要存储的每个类都有一个Map。
我决定的是一个HashMap<String, Integer>
包含要存储的每个类的列表列表的键索引映射的单曲。例如,对的调用getString(String key)
将从映射中获取与该键关联的整数索引(如果存在),然后尝试在关联的中获取该索引处的对象ArrayList<String>
。
唯一的歧义是要么返回null
(该类的列表中不存在索引),要么返回正确类的错误对象(存在映射索引,但使用该键存储的原始对象位于另一个List中)
,这实际上是程序员要检查的责任。
此类的对象只是临时容器,用于以标准化方式将数据从一个地方运送到另一个地方。他们不是要坚持下去。他们也不会以同样的方式为捆绑使用,虽然部分原因我想这样一个统一的数据容器是能够很容易地转换为Bundle
,JSONObject
,ContentValues
或Cursor
和背部。
也许真正的问题是:真的真的那么糟糕,还是我会竭尽全力避免这种情况?我猜想,好的编程实际上是避免这两种情况中模棱两可的唯一方法。
更新:
看起来Bundle仅在从Parcel中解包时才使用Classloader,但是在每次put()调用时都会对unparcel()进行调用。检索时,它仅在的try-
catch块内强制转换为方法返回的类型ClassCastException
。那可能是最简单的方法。
是否有适用于Android的基准测试工具,可以用来查看哪个对象的内存更大和/或需要更多的处理时间来存储/检索值?
是的,Android为开发人员提供了许多出色的工具,建议您了解它们。在这里,您具有正式的文档链接,这是一个良好的开端。
假设您在Eclipse中,请切换到DDMS透视图。
现在,这些视图应该对测量内存有帮助:
要分析您的应用程序,请参阅瓶颈等。请使用 Traceview 。为了从Eclipse打开 Threads
视图方便地调用它,并在运行程序时单击带有红色圆圈的按钮,例如“记录按钮”。
问题内容: 众所周知,Java 5引入了Instrumentation的功能,可轻松获得对象的大小。Android和Dalvik上有这种方法吗? 该软件包在Android上不可用。 问题答案: 对于它的价值,我查看了Dalvik VM源代码,但找不到任何稳定的API来获取对象的大小。如果您想自己看一下,对象的大小存储在中,请参见 dalvik / vm / oo / Object.h 。 但是,有
问题内容: 有谁知道如何获得变量(内存大小,,等),并打印出来?可能吗? 问题答案: 您可以为此使用unsafe.Sizeof函数。它返回以字节为单位的大小,该大小由您传递给它的值占据。这是一个工作示例: 请注意,某些平台明确禁止使用不安全,因为它是不安全的。这曾经包括AppEngine。不知道今天是否仍然如此,但我想是这样。 正如@Timur Fayzrakhmanov指出的那样,它将为您提供相
问题内容: 我对和的内存成本感到好奇,因此我编写了一个程序来比较大小。我通过获得内存大小,但是显然这是错误的,因为当我更改大小时,输出是相同的。 问题答案: 并且仅返回传递值的大小,而无需递归遍历数据结构和添加指针值的大小。 slice是相对简单的结构:,并且由于我们知道它引用了后备数组,因此我们可以轻松地“手动”计算其大小,例如: 输出(在Go Playground上尝试): 地图是更复杂的数据
问题内容: 我有一个AJAX请求返回的json对象,而我遇到了一些麻烦,因为它一直在返回。只想知道我是否使用正确: 它们都是有效对象,即使它们都返回。 更新: 返回了JSON对象的示例: 问题答案: 你可以用这样的东西
问题内容: 我想获取上传图片的大小以控制它是否大于最大文件上传限制。我尝试了以下操作: 它印0有我在哪里做错了?我应该从它的临时路径中找到该图像的大小吗?难道没有像Python 那样的PHP 吗? 问题答案: 这里需要注意几件事-content_length属性将是浏览器报告的文件上载的内容长度,但是不幸的是,正如docs和source中指出的那样,许多浏览器没有发送此内容。 至于你的TypeEr
获取数组,对象或字符串的大小。 Get type of val (array, object or string). Use length property for arrays. Use length or size value if available or number of keys for objects. Use size of a Blob object created from v