我的程序大部分时间都花在objc_msgSend上。这是否意味着Objective-C表现不佳?

时间:2010-05-11 15:03:47

标签: objective-c cocoa performance drawing

我编写了一个包含许多自定义视图的应用程序,通常会绘制很多行和位图。由于性能对应用程序来说有点关键,因此我花了很多时间来优化绘图性能。

现在,活动监视器告诉我,我的应用程序通常使用大约12%的CPU和仪器(分析器)说在objc_msgSend中花费了大量10%的CPU(主要用于绘制相关的系统调用)。 / p>

一方面,我很高兴这一点,因为这意味着我的绘图的速度和它的优化速度一样快,而且我的优化也取得了巨大的成功。另一方面,它似乎意味着仍然使用我的CPU的唯一事情是消息的Objective-C开销(objc_msgSend)。因此,如果我在Carbon中编写了应用程序,那么它的性能将会大大改善。

现在我很想得出结论,Objective-C是一种表现不佳的语言,尽管Cocoa似乎效率非常高,因为它显然可以比Objective-C发送消息更快地绘制。

那么,Objective-C真的是一种表现不佳的语言吗?你怎么看待这个?

2 个答案:

答案 0 :(得分:9)

不,Objective-C的表现并不差。为了证据,我引用@bbum关于objc_msgSend的手动优化组装的系列文章:

  1. The Roadmap
  2. Setting the Stage
  3. The Fast Path
  4. Method Lookup and some odds and ends
  5. 换句话说,objc_msgSend很快;方法调度不是你的问题。您是否可以发布导致您相信的分析信息?您可能误读了分析,或者您正在做一些非常奇怪的事情,等等。

    但我保证objc_msgSend不是问题所在。如果是的话,我们现在肯定会听说过它。 :)

答案 1 :(得分:2)

您在哪个方向查看呼叫树(请参阅标记为“反向呼叫树”的复选框)?

如果您将调用堆栈反转,您是否已深入到objc_msgSend以查看花费的时间?

默认显示的“运行时间%”(cntrl-click to change)表示“代码忙碌的时间百分比” - 例如。如果你运行1个短快速方法然后空闲10小时你的方法的百分比时间,因此对于objc_msgSend,因为这是调用你的方法的方法 - 将是%100 - 这并不意味着objc_msgSend很慢。 / p>