我正在尝试拼凑并运行用户组合的任务列表。这些任务列表可以是数百或数千个项目。
据我所知,最简单,最明显的方法是构建一个数组,然后迭代它们:
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实现。例如,我可以将链接列表组合在一起并使用块来处理下一个任务。我会从中获得任何东西,还是比它的价值更麻烦?
答案 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:
而不是遍历对象,但我认为它不会产生很大的性能差异。