我正在开发一个应用程序,我有一个存储20个精灵的NSMutableArray。我需要相当快速有效地迭代它。我的目的的速度并不是最优的...我从每个精灵中得到两个值,因为它迭代通过,是否更有效(更快)迭代一个CGPoints数组然后一个sprite数组?或者代替CGPoint创建一个自定义类,仅用于处理两个整数值。无论哪种方式,速度是否受到存储在数组中的对象类型或值的影响?
答案 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开销:传递消息(例如count
和objectAtIndex:
)会经过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