【问题标题】:Using XCode and instruments to improve iPhone app performance使用 XCode 和工具来提高 iPhone 应用程序的性能
【发布时间】:2011-06-27 05:43:48
【问题描述】:

我已经断断续续地试验了一段时间的 Instruments,但我仍然无法执行以下操作(有任何合理的结果):确定或估计一个被多次调用的函数的平均运行时间。

例如,如果我使用 CADisplayLink 以 60 Hz 的频率驱动我的 gameLoop,我想看看循环运行平均需要多长时间... 10 毫秒? 30 毫秒等。

我已接近使用“CPU 活动”工具,但结果不一致或没有意义。时间分析器似乎很有希望,但我能得到的只是“运行时的百分比”......我想要一个 实际 运行时。

【问题讨论】:

    标签: iphone xcode profiling instruments


    【解决方案1】:

    我不确定乐器是您最好的选择。 Instruments 对您的代码进行采样,这意味着(除其他外)它会影响时间。如果你想知道一个循环需要多长时间,那么你应该在代码中添加一些东西来计算并保留或显示每个循环所用的时间。

    一个实际的运行时可以通过:

    // activity starts
    NSDate* startTime = [NSDate date];
    
    // activity ends
    NSLog(@"time elapsed this loop is %f", fabs([startTime timeIntervalSinceNow]));
    

    如果您计算了每个循环的时间,则很容易获得平均值,因为您可以在显示平均值之前对时间求和、计算循环数并除以。

    当然,

    循环中的任何东西都会影响时间,但这影响很小。

    【讨论】:

    • 可能 %f 和 abs 不是您想要的组合——也许是晶圆厂?还是 %i?
    【解决方案2】:

    您应该尝试使用Shark 进行您所说的时间分析。

    【讨论】:

    • 我确实尝试过鲨鱼。不幸的是,听起来 Apple 停止了适用于 iOS 4+ 的 Shark。仪器“时间分析器”显然是建议的替代品:-(
    【解决方案3】:

    我已经尝试过 Time Profiler,但它不会为您提供方法的平均或总运行时间。它只是告诉您在录制期间您的代码在方法中花费了多少时间。它告诉您您的代码在一个方法中花费了大量时间,但没有告诉您这是因为该方法运行了一次并且花费了很长时间,还是该方法被调用了很多次但运行得非常快。如果是前者,那么您应该专注于使该方法更快。如果是后者,您应该让您的代码不那么频繁地调用该方法。你必须弄清楚它是你自己。让事情变得更加困难的是运行循环,它具有触发诸如计时器服务或 I/O 之类的事件的输入源。这些被传递给可能是 Apple 的处理程序。如果 Apple 的某个处理程序需要很长时间,那么 Time Profiler 会将其显示为热点,但除非您知道该处理程序在做什么以及为什么您无能为力。 Apple 的东西甚至不一定在调用堆栈末端的任何地方调用,因此您不能很容易地进行优化。我在 OpenGL ES Analyzer 方面取得了更大的成功,因为它的 API 统计信息为您提供了 OpenGL ES 调用的调用次数、总时间和平均时间。如果您不使用 OpenGL ES,则对您没有帮助。

    【讨论】:

    • 同意时间分析器应该显示一个计数器和一个平均运行时间。为了弥补它,您可以在所有调用中添加一个简单的宏:#define COUNT(description, n) { \ static long counter = 0; \ if (++counter % (n) == 0) { \ NSLog(@"Count %@: %ld", 描述, 计数器); \ } \ } 将 COUNT(@"Very slow method!", 10) 添加到您的代码中,它会每隔 10 次记录您的方法被调用一次。不理想,但是...
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多