Objective-C Массив Скорость итерации - PullRequest
3 голосов
/ 05 декабря 2009

Я работаю над приложением, у меня есть NSMutableArray, который хранит около 20 спрайтов. Мне нужно пройти это довольно быстро и эффективно. Скорость для моих целей не оптимальна ... Я получаю два значения от каждого спрайта, когда он проходит итерацию, будет ли эффективнее (быстрее) выполнять итерацию по массиву, скажем, CGPoints, а не по массиву спрайтов? Или вместо CGPoint создайте пользовательский класс с единственной целью обработки только двух целочисленных значений. В любом случае, скорость зависит от типа объектов или значений, хранящихся в массиве?

Ответы [ 2 ]

9 голосов
/ 05 декабря 2009

Скорость итерации не зависит от того, какой тип данных вы храните в массиве. На влияет тип используемого вами массива: существуют значительные различия между повторением 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
9 голосов
/ 05 декабря 2009

Не думаю, что вам стоит беспокоиться о скорости итерации только для 20 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...