BTN*_*BTN 3 arrays performance loops objective-c
我正在开发一个应用程序,我有一个NSMutableArray可以存储20个左右的精灵.我需要相当快速有效地迭代它.我的目的的速度并不是最优的...我从每个精灵中得到两个值,因为它迭代通过,是否更有效(更快)迭代一个CGPoints数组然后一个sprite数组?或者代替CGPoint创建一个自定义类,仅用于处理两个整数值.无论哪种方式,速度是否受存储在数组中的对象类型或值的影响?
迭代速度不受您在阵列中存储的数据类型的影响.它是受您使用的数组的类型:有显著迭代之间通过一个Objective-C的差异NSArray(或者它的任何子类,如NSMutableArray)C风格阵列的C++,或std::vector.
如果你正在使用一个NSArray,并且你正在使用Objective-C 2.0(例如在iPhone或Mac OS X 10.5或更高版本上),你可以使用快速枚举来迭代,这比旧的迭代风格要快得多:
// 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
}
Run Code Online (Sandbox Code Playgroud)
我不确定枚举与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
Run Code Online (Sandbox Code Playgroud)