我的程序大部分时间都花在 objc_msgSend 上。这是不是意味着 Objective-C 的性能很差?

Posted

技术标签:

【中文标题】我的程序大部分时间都花在 objc_msgSend 上。这是不是意味着 Objective-C 的性能很差?【英文标题】:My program is spending most of its time in objc_msgSend. Does that mean that Objective-C has bad performance?我的程序大部分时间都花在 objc_msgSend 上。这是否意味着 Objective-C 的性能很差? 【发布时间】:2010-05-11 15:03:46 【问题描述】:

我编写了一个应用程序,它有许多自定义视图,通常会绘制很多线条和位图。由于性能对应用程序来说有些关键,因此我花费了大量时间优化绘图性能。

现在,活动监视器告诉我,我的应用程序通常使用大约 12% 的 CPU,而 Instrument(分析器)说在 objc_msgSend(主要用于绘图相关的系统调用)中花费了高达 10% 的 CPU。

一方面,我对此感到高兴,因为这意味着 我的 绘图速度几乎与它一样快,并且我的优化取得了巨大成功。另一方面,这似乎意味着唯一仍在使用我的 CPU 的是 Objective-C 的消息开销 (objc_msgSend)。因此,如果我在 Carbon 中编写应用程序,它的性能会大大提高。

现在我很想得出结论,Objective-C 是一种性能很差的语言,尽管 Cocoa 似乎非常高效,因为它的绘制速度显然比 Objective-C 发送消息的速度要快。

那么,Objective-C 真的是一门性能很差的语言吗?你怎么看?

【问题讨论】:

这里没有必要成为一个社区维基... 我认为“objc_msgSend 中的 10%”是指“程序花费的时间的 10%”。如果程序只花费总 CPU 的 12%,objc_msgSend 花费总 CPU 时间的 1%。 【参考方案1】:

不,Objective-C 的性能还不错。作为证据,我引用了@bbum 的系列文章,关于objc_msgSend 的手工优化组装:

    The Roadmap Setting the Stage The Fast Path Method Lookup and some odds and ends

换句话说,objc_msgSend 很快;方法调度不是你的问题。你能发布你的分析信息,让你不相信吗?可能是您误读了分析,或者您在幕后做了一些非常奇怪的事情,等等。

但我向你保证objc_msgSend 不是问题所在。如果是的话,我们现在肯定已经听说了。 :)

【讨论】:

如果程序将 10% 的时间花在 obj_msg_send 上,我一点也不感到惊讶。我见过更高的百分比。我在 Objective C 中编写了一个 6502 仿真器,并且在 obj_msg_send 中看到了大约 20% 或更多的时间。与 C 函数调用相比,obj_msg_send 的成本很高,但另一方面,即使用纯 C 重写我的 6502 仿真器也只会获得 20% 的收益。碰巧我能够通过简单的明显优化获得很多收益,例如:for (i = 0; i < [array count] ; ++i) => size_t arrayCount = [array count] ; for (i = 0 ; i < arrayCount...【参考方案2】:

您查看调用树的方式是什么(请参阅标记为“反转调用树”的复选框)?

如果您将调用堆栈倒置,您是否深入到 objc_msgSend 以查看时间花在了哪里?

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

【讨论】:

正如我所说,时间主要花在绘图相关的调用上。但这仍然意味着绘制速度主要受 objc_msgSend 的限制,不是吗? 不不,根本不是这个意思。比如说,你看到 'objc_msgSend 10%',然后深入研究,你会看到里面 objc_msgSend '-init 3.33%', '-drawRect 3.33%', 'dealloc 3.33%' 那是你的 10%,被你的方法,因此 objc_msgSend 的开销为零(实际上接近于零)。您使用 12% 的 cpu 的事实意味着您有 88% 的时间处于空闲状态(如果您有 1 个核心,如果您有 2 个核心,则为 188% 等),因此您实际上根本没有受到限制 - 您没有接近使用可用的 cpu 资源。 你能把 Instruments 的报告贴在某个地方让我们看到吗? @Yuji 对不起,我不能,否则我会泄露公司机密。

以上是关于我的程序大部分时间都花在 objc_msgSend 上。这是不是意味着 Objective-C 的性能很差?的主要内容,如果未能解决你的问题,请参考以下文章

做Data Mining,其实大部分时间都花在清洗数据

软件上线

Python inspect.stack 很慢

为啥 __nss_database_lookup 在我的数字 C++ 程序中占用大部分时间

什么是objc_msgSend,为什么它占用了这么多处理时间?

CSS代码规范