1

我正在尝试拼凑并运行用户放在一起的任务列表。这些任务列表可能有数百或数千个项目。

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

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 实现。例如,我可以将一个链表放在一起,并使用一个块来处理下一个任务。我会从中得到什么,还是真的比它的价值更麻烦?

4

3 回答 3

7

我假设您在谈论objc_msgSend,在这种情况下,Bill Bumgarner 有一个优秀的 4 部分系列值得一读。

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

于 2010-06-03T00:05:12.523 回答
1

rynmrtn 说什么...

除非您的-execute方法非常简单——增加/测试少量标量值——否则它objc_msgSend()甚至不太可能显示为程序 CPU 时间的百分比。

先测量,后优化。

您的代码确实提出了一个问题;你为什么要把东西放进arrayOfTasks那个可能做不到的东西execute。假设您的所有内容都是arrayOfTasks您制作的子类,您可以添加一个execute方法而不进行响应测试。如果您有集合类的层次结构,则可以使用类别来添加方法——只需在它们上加上前缀以确保安全(即pxl_execute或其他)。

于 2010-06-03T03:49:06.490 回答
1

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

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

于 2010-06-03T04:00:24.260 回答