gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:16 25 4
gpt4 key购买 nike

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

长话短说:

我查看了 android.os.Bundle 类的源代码,我不喜欢它存储和返回对象的方式。它只是将它们存储在 HashMap<String, Object> 中。然后使用类加载器转换为请求对象的类(如 getString()getInt() )。我觉得这个,或者任何与此相关的类转换,都违反了类型安全并在编程级别引入了歧义,而这正是静态类型旨在防止的,不是吗?

我想创建一个不违反类型安全且不引入歧义的类似数据容器类。逻辑上简单但显然效率低下的方法是为我要存储的每个类都有一个 Map。

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

这里唯一的歧义是返回 null (该类的列表中不存在索引)或正确类的错误对象(映射索引存在但使用该键存储的原始对象在另一个列表中),这实际上是程序员的责任检查。

此类的对象只是临时容器,用于以标准化方式将数据从一个地方传送到另一个地方。他们不打算留下来。它们的使用方式也与 Bundle 不同,尽管我想要像这样的统一数据容器的部分原因是能够轻松转换为 Bundle。 , JSONObject , ContentValuesCursor并返回。

或者也许真正的问题是:类型转换真的那么糟糕,还是我只是竭尽全力避免它?我想在这两种情况下,良好的编程确实是避免歧义的唯一方法。

更新:

看起来 Bundle 只在从 Parcel 解包时才使用类加载器,但它会在每次调用 put() 时调用 unparcel() 。检索时,它只是转换为方法返回的类型,在 ClassCastException 的 try-catch block 内.这可能是最简单的方法。

最佳答案

Are there any benchmarking tools out there for Android that I can use to see which object is bigger in memory and/or takes more processing time to store/retrieve values?

是的,Android 为开发者提供了很多很棒的工具,建议去了解它们。这里有官方文档link一个好的开始。

切换到 DDMS 透视图,假设您在 Eclipse 中。

现在,这些 View 应该对您测量内存有帮助:

  • 分配跟踪器。您可以查看哪些对象占用了多少内存。在运行过程中,您必须按下“开始跟踪”按钮,然后再按下“获取分配”按钮。
  • 堆。您可以看到从堆中占用了多少内存。

要分析您的应用程序,查看瓶颈等,请使用 Traceview。为了从 Eclipse 中方便地调用它,请打开 Threads View 并在运行程序时单击带有红色圆圈的按钮,例如“记录按钮”。

关于java - 如何获取 Android 中对象的内存大小或性能基准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14366410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com