【问题标题】:Objective-C Array Iteration SpeedObjective-C 数组迭代速度
【发布时间】:2009-12-04 22:05:00
【问题描述】:

我正在开发一个应用程序,我有一个 NSMutableArray 可以存储 20 个左右的精灵。我需要快速有效地迭代它。出于我的目的,速度不是最佳的......我从每个精灵中获取两个值,因为它迭代,遍历一组说 CGPoints 然后遍历一组精灵会更有效(更快)吗?或者代替 CGPoint 创建一个自定义类,其唯一目的是处理两个整数值。无论哪种方式,速度是否受存储在数组中的对象类型或值的影响?

【问题讨论】:

  • 先配置文件看看性能问题出在哪里,然后优化热点。

标签: objective-c arrays performance loops


【解决方案1】:

我认为您不必担心仅 20 项的迭代速度。

【讨论】:

  • 同意。不要为此烦恼,除非 n 可以任意大,如果您要迭代很多,或者有一天它会比 20 大得多。如果肯定会是 ~20,请寻找其他地方来指导您的优化努力。
  • 看我通常不会,但我正在开发一款游戏,并且这种遍历数组的方法大约每秒被调用 2 次。所以速度变化会被游戏的响应时间所吸收,这不是很明显,但仍然有些人可能会受到它的困扰。我制作了一个 CGPoints 的 C 数组并注意到了改进......不过感谢您的帮助。
【解决方案2】:

迭代速度不受您在数组中存储的数据类型的影响。它受您正在使用的数组类型的影响:迭代 Objective-C NSArray(或其任何子类,例如 NSMutableArray)和 C -style 数组,或 C++ std::vector

如果您使用NSArray,并且您使用的是Objective-C 2.0(例如在iPhone 或Mac OS X 10.5 或更高版本上),您可以使用fast enumeration 进行迭代,这明显更快比旧的迭代风格:

// Fast enumeration
for(id object in myNSArray)
    ;  // do stuff with object

// Slow enumeration
int count = [myNSArray count], i;
for(i = 0; i < count; i++)
{
    id object = [myNSArray objectAtIndex:i];
    // do stuff with object
}

我不确定枚举与 C 样式数组或 C++ std::vectors 相比有多快,但我敢打赌它仍然会慢一些。它更慢是因为你有 Objective-C 的额外开销:传递消息(例如 countobjectAtIndex:)通过 Objective-C 运行时,即使在最好的情况下也比裸指针算法慢。

通过 C 样式数组或 C++ std::vector 进行迭代非常快,因为编译器可以将它们优化为非常简单的指针算术指令而没有开销:

// C-style array
SomeType *myArray = ...;  // e.g. malloc(myArraySize * sizeof(SomeType))
int i;
for(i = 0; i < myArraySize; i++)
    ; // do stuff with myArray[i]

// C++ vector
std::vector<SomeType> myArray = ...;
for(std::vector<SomeType>::iterator i = myArray.begin(); i != myArray.end(); ++i)
    ; // do stuff with *i

【讨论】:

  • 那么也许我的答案是一个 C CGPoints 数组?
  • 快速枚举真的比在 obj-c 中循环的旧方法更快吗?它不只是同一事物的语法糖吗?
  • 速度更快。实际上,它是从迭代器中获取裸数组并对其进行迭代的语法糖。正如亚当斯链接中所解释的那样。另一方面,这意味着这种漂亮的语法不能用于迭代其他一些未知长度的集合。所以它与 python for ... in ...: 或 Java for(... : ...) 完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2011-10-03
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多