Objective-C阵列迭代速度

时间:2009-12-04 22:05:01

标签: objective-c arrays performance loops

我正在开发一个应用程序,我有一个存储20个精灵的NSMutableArray。我需要相当快速有效地迭代它。我的目的的速度并不是最优的...我从每个精灵中得到两个值,因为它迭代通过,是否更有效(更快)迭代一个CGPoints数组然后一个sprite数组?或者代替CGPoint创建一个自定义类,仅用于处理两个整数值。无论哪种方式,速度是否受到存储在数组中的对象类型或值的影响?

2 个答案:

答案 0 :(得分:9)

我认为你不应该担心只有20个项目的迭代速度。

答案 1 :(得分:9)

迭代速度不受您在阵列中存储的数据类型的影响。 受您正在使用的数组类型的影响:迭代Objective-C NSArray(或其任何子类,例如NSMutableArray)之间存在显着差异),C风格的数组,或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::vector相比有多快,但我敢打赌,它仍然有点慢。它的速度较慢,因为你有额外的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