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

长话短说,我想testing我的这个类的android.os.Bundle类的克隆实现,看看哪个更好。 我已经知道我的版本可能会更糟糕,但我想知道有多糟糕。 有Android的基准testing工具,我可以用它来查看哪个对象在内存中更大,和/或需要更多的处理时间来存储/检索值?

TL; DR:

我看了android.os.Bundle类的源代码,我不喜欢它如何存储和返回对象。 它只是将它们存储在HashMap<String, Object> ,然后使用ClassLoader转换为请求的对象的类(如getString()getInt() )。 我觉得这个或者这个类的任何types都是违反types安全性的,并且在编程层面引入了模糊性,这是静态types打算防止的,是不是?

我想创build一个类似的数据容器类,不违反types安全性,不会引入歧义。 这个逻辑上简单但显然效率低下的方法是为每个我想要存储的类创build一个Map。

我决定的是一个HashMap<String, Integer> ,它包含我要存储的每个类的各种各样的List的键索引映射。 例如,调用getString(String key)将获得与该键相关联的整数索引(如果该键存在),然后尝试在关联的ArrayList<String>中的该索引处获取该对象。

    这里唯一不明确的地方是返回null (这个索引不存在于那个List的List中)或者是正确类的错误对象(映射索引存在,但是存储在这个关键字中的原始对象在另一个List中),这确实是程序员检查的责任。

    这个类的对象只是临时容器,用于以标准化的方式将数据从一个地方运送到另一个地方。 他们不是要坚持。 他们也没有像Bundles一样使用,虽然我想要一个像这样的统一数据容器的一部分原因是能够轻松地转换为BundleJSONObjectContentValues或者Cursor

    或者,也许真正的问题是:铸造真的很糟糕,还是我要尽力避免它? 我想好的程序devise是避免两种情况的唯一方法。

    更新:

    它看起来像Bundle在从Parcel中解包时只使用Classloader,但是每次调用put()都会调用unparcel()。 在检索它时,只需转换为方法返回的types,在ClassCastException的try-catch块内。 这可能是最简单的方法。

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

    是否有Android的基准testing工具,我可以用它来查看哪些对象在内存中较大和/或需要更多处理时间来存储/检索值?

    是的,Android为开发人员提供了许多优秀的工具,build议您了解它们。 在这里你有一个良好的开始正式文件链接 。

    切换到DDMS的angular度,假设你在Eclipse中。

    现在,这些观点应该有助于你测量记忆:

    • 分配跟踪器。 你可以看到哪些对象需要多less内存。 在运行过程中,您必须按下“开始追踪”button和稍后的“获取分配”。
    • 堆。 你可以看到从堆中取出了多less内存。

    要分析您的应用程序,请参阅瓶颈等使用Traceview 。 从Eclipse中打开Threads视图并在运行程序时,可以方便地调用它,点击带有红色圆圈的button,如“loggingbutton”。

    有Android的基准testing工具,我可以用它来查看内存中哪个对象更大

    垫。

    和/或需要更多的处理时间来存储/检索值?

    Traceview。

    我觉得这个或者这个类的任何types都是违反types安全性的,并且在编程层面引入了模糊性,这是静态types打算防止的,是不是?

    静态打字就像一个调料。 适量的多less取决于品尝者。

    我会推荐MAT(内存分析工具),但也有警告。 要知道像图像这样的东西并不是以特定的版本存储在堆内存中,例如,在蜂窝之前,图像存储在本机内存中。 因此,检查内存可能不是很准确,但我会build议你的情况。

    刚刚检查多less字节是你的对象是什么?

     private byte[] getBytes(Object o) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = null; try { out = new ObjectOutputStream(bos); out.writeObject(o); return bos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException ex) { // ignore close exception } try { bos.close(); } catch (IOException ex) { // ignore close exception } } return null; } 

    只需将您的对象传递给此方法并打印其长度。

    编辑:你试图检查的对象必须实现Serializable