当前位置: 首页 > 面试题库 >

如何获取Android中对象的内存大小或性能基准?

易镜
2023-03-14
问题内容

长话短说,我想针对该类测试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中)
,这实际上是程序员要检查的责任。

此类的对象只是临时容器,用于以标准化方式将数据从一个地方运送到另一个地方。他们不是要坚持下去。他们也不会以同样的方式为捆绑使用,虽然部分原因我想这样一个统一的数据容器是能够很容易地转换为BundleJSONObjectContentValuesCursor和背部。

也许真正的问题是:真的真的那么糟糕,还是我会竭尽全力避免这种情况?我猜想,好的编程实际上是避免这两种情况中模棱两可的唯一方法。

更新:

看起来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