Скорость итерации не зависит от того, какой тип данных вы храните в массиве. На влияет тип используемого вами массива: существуют значительные различия между повторением 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
}
Я не уверен, насколько быстро перечисление сравнивается с массивами в стиле C или C ++ std::vector
s, но могу поспорить, что оно все еще немного медленнее. Это медленнее, потому что у вас есть дополнительные издержки 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