【问题标题】:How to profile memory usage & performance with Instruments?如何使用 Instruments 分析内存使用情况和性能?
【发布时间】:2011-10-02 06:17:42
【问题描述】:

在所有 Instruments 跟踪模板中,我喜欢使用:

  • 僵尸检测对象过度释放的位置,非常适合调试EXEC_BAD_ACCESS 错误。
  • Leaks 以检测内存泄漏。
  • 带有颜色混合层的核心动画可检测帧速率和半透明子视图,非常适合平滑UITableView 滚动。

我总是听到有人说要分析我的应用的内存使用情况和性能。

  1. 为什么要分析内存使用和性能?我的应用运行良好。
  2. 我该怎么做?

我使用了 Allocations,发现我的 iPhone 应用程序从 1 MB 的总分配内存开始,并在正常使用后增长到​​ 5 MB。什么是 iPhone 上的内存使用量过高?平板电脑?麦克?

【问题讨论】:

    标签: xcode performance profiling instruments allocation


    【解决方案1】:

    要回答原因,分析内存使用情况对于 iOS 应用程序尤其重要,因为 iPhone 和 iPad 的 RAM 比 Mac 少得多。 iPhone 4 有 512 MB 的 RAM,但早期版本有 256 或 128 MB。考虑到操作系统使用的 RAM 和多任务处理,您的应用不会浪费太多 RAM,因此了解您的应用使用多少内存非常重要。

    分析性能是您在应用运行缓慢时通常会做的事情。分析它以查找代码中的慢点,以便您可以使代码运行得更快。如果您的应用运行良好,那么您就不需要对性能进行分析。

    要回答问题,请使用分配工具来测量内存使用情况。 All Allocations 类别中的 Live Bytes 列告诉您应用程序当前使用的内存量。 Allocations 工具的 heapshot 分析测量应用程序中的内存增长。使用跳转栏左侧的菜单进行heapshot分析。

    Time Profiler 工具会分析您的应用的性能。使用 Time Profiler 仪器的难点在于解释结果。 Time Profiler 工具不会告诉您您的应用程序在 Function X 中花费了 75% 的时间。您必须深入挖掘数据才能找到代码中的慢点。

    关于可接受的内存使用量,这取决于您要支持的设备和应用程序。像 Xcode 这样的应用程序使用 100 MB 的 RAM 是可以的,但是像 TextEdit 这样的应用程序使用 100 MB 的单页文档将是一个问题。 5 MB 对于 iOS 应用来说应该不是问题。

    【讨论】:

    • 感谢您给出如此全面的答复! :)
    • 我发现分配工具在涉及到我的应用程序实际使用的内存量时会产生误导。它往往给出远低于实际内存使用量的数字。 Memory Manager 工具会在 Real memory 列中为您提供应用程序正在使用的实际内存量。我正在开发一个 OpenGL 游戏,并且左右出现内存不足的警告。 Allocations 说我只使用了 12M 的 RAM,Memory Manager 说我使用了 100M。所以,你去吧。
    • @Ian see stackoverflow.com/a/8797272/287403 似乎实时字节更准确,因为内存工具中的“真实内存”列继续显示您很久以前发布的块并且操作系统尚未回收.另请参阅stackoverflow.com/a/7574959/287403,其中我认为整体字节应该更接近“真实内存”
    • 我们目前正在尝试处理我们的应用程序一次可以显示多少张大图像。在使用 [UIImage imageNamed:] 和/或 [UIImage imageWithContentsOfFile:] 编写刚刚在 UIScrollView 上抛出大 JPG 的测试应用程序后,我们发现 Allocations 在应用程序崩溃之前仅显示 5MB 的使用量,而 Real Memory Usage显示大约 750MB。因此,出于我们的目的,在这种情况下,Real Memory Usage 为我们提供了更多有用的信息。
    【解决方案2】:

    解决马克回答中的一些问题:

    分配实时字节不包括 CALayer/UIViews 使用的 OpenGL 纹理内存。这就是与内存监视器产生分歧的根源。

    在此处查看此问题的答案: Understanding the memory consumption on iPhone

    【讨论】:

      【解决方案3】:

      真正加载到设备物理内存中的内存是VM Tracker Instrument中的Resident Memory

      Allocation Instrument 只标记malloc/[NSObject alloc] 和一些框架缓冲区创建的内存,例如,Allocation Instrument 中不包含解压缩的图像位图,但它总是占用大部分内存。

      请观看 WWDC 2012 Session 242 iOS App Performance: Memory 从 Apple 获取信息。

      【讨论】:

        猜你喜欢
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        相关资源
        最近更新 更多