我是不是正确使用了时间分析仪?
Posted
技术标签:
【中文标题】我是不是正确使用了时间分析仪?【英文标题】:Am I using the time profiler instrument correctly?我是否正确使用了时间分析仪? 【发布时间】:2012-08-20 15:18:46 【问题描述】:我正在为 iPad 开发一个绘图应用程序。我正在尝试加快绘图速度,因此我正在使用时间分析仪进行一些测试。但是,我要么做错了什么,要么时间分析器在这种情况下没有帮助。
我正在寻找的基本上是正在绘制的代码的逐行执行时间。我得到的是下面。基本上,时间分析器会说“你花了很多时间画画”。我的回答是“哦,rly!?”。我是否正确使用了分析器,或者有没有办法让它逐行显示执行时间(这比当前输出有用得多)?
编辑:在上面,您可以看到更多我正在寻找的内容。逐行执行时间。这不是我的代码,只是我希望/期望时间分析器如何工作的一个示例。
Edit2:在模拟器上运行时,您只能逐个查看方法的执行时间吗?我刚刚尝试在模拟器上进行分析,输出正是我所期望的。但是,我真的希望使用该设备进行更准确的分析:(
【问题讨论】:
你的绘图代码在什么方法或函数中? 大部分都在 - (void)drawInContext:(CGContextRef)context 中,它从我的 drawRect 方法中传递了一个上下文,用于我的一个视图。澄清一下,我包含的第三张图片不是我的代码,它只是我正在寻找的执行时间显示类型。 【参考方案1】:时间分析工具在设备上的行为似乎与在模拟器中不同。模拟器版本让我可以逐行查看执行时间,而在设备上进行分析时,我只能得到上面的输出,这没什么用处。
【讨论】:
【参考方案2】:我相信,您无法使用时间分析器来实现这一点,因为它会收集大量样本并将它们统一起来以显示您花费时间最多的地方。
您可能会使用一些“原始”dtrace 脚本来解决此任务。或者,您可以编写基于mach_absolute_time
的采样代码(this QA 可能有助于稍后将值转换为更有意义的数据)。
【讨论】:
很好地考虑使用 mach_absolute_time。我会记住这一点作为备份。但是,正如您在上面的最后一张图片中看到的那样,我知道可以逐行获取运行时间,但由于某种原因,在我的特定情况下可能不是。 尝试选择您的方法?它应该在堆栈跟踪的某个位置的右侧窗格中可用。 我也是这么想的,但我在窗格中的任何地方都没有看到它... 耸耸肩 汇编代码截图是我检查一直占用的[UIView drawInLayer]方法时得到的。【参考方案3】:要获得所需的逐行执行时间,您必须双击您在调用树中编写的函数。在您的屏幕截图中,您双击了 Apple 编写的 UIView 方法。你得到反汇编是因为它是 Apple 的代码,而不是你的。
如果您想专注于调用树中的代码,请选中隐藏系统库复选框,该复选框位于您在屏幕截图中选中的仅显示 Obj-C 复选框的上方。隐藏系统库可以更容易地在调用树中找到您的代码,这将帮助您逐行了解执行时间。
【讨论】:
如果我选中“隐藏系统库”,但同时选中 Show Obj-C Only,调用树中不会出现任何内容。 更新了我的问题。在对模拟器进行分析时,我能够逐个查看方法,但这在设备上是否可行? 我通常不会选中 Show Obj-C Only 复选框。如果取消选择 Show Obj-C only 复选框,调用树中是否会出现某些内容?我无法验证您是否可以在设备上获得逐行结果,因为 Xcode 4.4 不允许我在运行 ios 5.1 的设备上使用 Time Profiler 仪器进行分析。 是的,但是我看不到任何方法调用,就像我在分析模拟器时所做的那样。 您可以尝试选择隐藏缺失符号复选框而不是隐藏系统库复选框,看看是否会有所改变。以上是关于我是不是正确使用了时间分析仪?的主要内容,如果未能解决你的问题,请参考以下文章