msg_send调用会产生多少开销?

时间:2010-06-02 23:55:31

标签: objective-c cocoa objective-c-blocks

我正在尝试拼凑并运行用户组合的任务列表。这些任务列表可以是数百或数千个项目。

据我所知,最简单,最明显的方法是构建一个数组,然后迭代它们:

NSArray *arrayOfTasks = .... init and fill with thousands of tasks

for (id *eachTask in arrayOfTasks)
{
  if ( eachTask && [eachTask respondsToSelector:@selector(execute)] ) [eachTask execute];
}

对于台式机,这可能没问题,但对于iphone或ipad,这可能是个问题。这是一个很好的方法,还是有更快的方法来完成同样的事情?

我之所以要问msg_send发生了多少开销,我也可以做一个直接的C实现。例如,我可以将链接列表组合在一起并使用块来处理下一个任务。我会从中获得任何东西,还是比它的价值更麻烦?

3 个答案:

答案 0 :(得分:7)

我假设你在谈论objc_msgSend,在这种情况下,Bill Bumgarner非常出色 4 Part Series值得一读。

总的来说,我建议只使用Obj-C。这就是iDevices使用的所有应用程序,包括Apple,以及数百个项目都不会杀死该设备。

答案 1 :(得分:1)

rynmrtn说了什么......

除非你的-execute方法非常简单 - 递增/测试一小部分标量值 - 否则objc_msgSend()不太可能显示为程序CPU时间的百分比。

先测量,然后优化。

您的代码确实提出了一个问题;为什么要将内容放入可能无法arrayOfTasks的{​​{1}}。假设execute中的所有内容都是您创建的子类,您可以添加arrayOfTasks方法,而不是执行响应测试。如果你有一个集合类的层次结构,你可以使用类别来添加方法 - 只需在'em'上加上一个前缀即可(即execute或其他)。

答案 2 :(得分:1)

Here是常见操作的基准比较,包括objc_msgSend。一般来说,即使在iPhone上,也不必担心objc_msgSend性能。消息发送总是比直接C函数调用慢,但在现代处理器上(记住,iPhone处理器仍然是大约500 mhz),大多数时候差异很小。如果分析显示在objc_msgSend中使用了大量时间,则可能值得使用直接C函数而不是Objective-C方法。

为清楚起见,您可以使用-[NSArray makeObjectsPerformSelector:]或(在Mac上)enumerateObjectsUsingBlock:而不是遍历对象,但我认为它不会产生很大的性能差异。