【问题标题】:Understanding the Instruments Time Profiler column headings了解 Instruments Time Profiler 列标题
【发布时间】:2015-01-10 08:30:28
【问题描述】:

我正在通过分析器以 1 毫秒的采样率运行应用程序,但我无法理解列标题的含义。 documentation 似乎缺少大多数列标题的定义,尽管我设法破译了 Self# SelfSelf %来自答案here。这是我目前所拥有的:

  • 样本总数:程序在给定函数中的样本总数(1 毫秒)
  • 总时间:在函数中花费的总时间(对应于使用 1 毫秒采样率的总样本)
  • 自我:在链接的问题中进行了解释,但它与总时间有何不同?从中我应该能弄清楚#SelfSelf%的含义。
  • 总百分比:总样本占总运行时间的百分比

其余的列标题似乎是上述内容的组合(可能是由于 1 毫秒的采样率)或者是不言自明的。例如,我有一个函数总耗时 647621 毫秒 (89.4%),但 Self/#Self 为 9。这是否意味着该函数被频繁调用,但执行时间很少?另一方面,另一个函数需要 15559 毫秒的总时间 (2.1%) 但 Self/# Self 是 13099,这意味着它被调用的频率较低,但需要完成的时间要长得多。我在正确的轨道上吗?

【问题讨论】:

    标签: xcode instruments definition timing


    【解决方案1】:

    最新版本的 Instruments 没有 Total Samples 列,但我将解释总样本、总时间和 self 之间的区别,因为它解释了 Time Profiler 仪器的工作原理。 Time Profiler 仪器会定期记录调用堆栈,默认为每毫秒。 Total Samples 列告诉您方法在调用堆栈中的样本数。 Total Time 列告诉您方法在调用堆栈中的时间量。 Self 列告诉您方法在调用堆栈顶部的样本数,这意味着您的应用在 Instruments 记录样本时位于该方法中。

    Self 列比 Total Samples 和 Total Time 列重要得多。您的 main() 函数将具有很高的总样本数和很高的总时间,因为 main() 在应用程序运行的整个过程中都在调用堆栈中。但是花时间优化 Cocoa/Cocoa Touch 应用程序中的 main() 函数是浪费时间,因为 main() 所做的只是启动应用程序。专注于具有高自我价值的方法。

    仪器的最新版本有一个运行时间列。列中的每个列表都有两个值:时间和百分比。时间对应于您问题中的总时间。该百分比对应于您问题中的总百分比。

    更新

    让我在最后一段中回答有关您的函数示例的问题。在您的第一个示例中,您的应用程序没有在函数内花费太多时间(我将其称为函数 A),因为它的 Self 条目只有 9。这意味着您的应用程序在函数 A 中只有 9 个样本。总数很高time 意味着您的应用程序在 Function A 调用的函数中花费了大量时间。函数 A 经常在调用堆栈中,但通常不在调用堆栈的顶部。

    在您的第二个示例中,应用程序在函数 B 上花费了更多时间,因为它的 Self 条目是 13099。应用程序不会在函数 B 调用的函数上花费大量时间,因为总时间要小得多。函数 B 比 A 更频繁地位于调用堆栈的顶部,而在调用堆栈中的频率比 A 少。如果您的应用程序中存在性能问题,函数 B 将是检查提高其性能的方法的函数。优化函数 A 并没有多大帮助,因为它的 Self 条目只有 9。

    【讨论】:

    • 谢谢。这比文档更有意义,尤其是关于 main() 的内容。这是否也意味着我对这两个函数的示例进行了正确分析?
    • 谢谢!这完美地总结了它:)
    • @MarkSzymczyk 我有一个后续问题。当 Instagram 和 Snapchat 之类的应用程序似乎有类似的要求(例如类似的相机和查询)时,我一直在苦苦思索为什么它们的启动速度比我的快得多。 “Self”标题下没有弹出任何内容,“Running Time”下只有一个弹出 - 这是“main”,但是当我点击 main 时,它只是转到 AppDelegate 并显示 AppDelegate 为 100%。你说 main() 所做的只是启动应用程序,但为什么我的应用程序比其他应用程序花费这么多时间?我希望这个问题是有道理的。如果您愿意,我可以发布单独的问题。
    • @user3498976 你最好提出一个关于启动时间慢的新问题。我没有做太多的 iOS 开发,所以对于您的具体问题我帮不上什么忙,但是您应该查看在您的应用程序启动时调用的代码。示例包括 AppDelegate 和视图控制器中的 init 和视图加载方法。
    • @MarkSzymczyk 感谢您的回复。我在这里发布了一个新问题:stackoverflow.com/questions/32318610/… 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2011-07-27
    • 2012-01-16
    • 2020-02-24
    • 2015-05-26
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多