2017-02-06 6 views
3

Я знаю, что быстрое перечисление и цель в объекте C. Я хочу знать, почему быстрое перечисление происходит быстрее, чем обычная итерация?Почему быстрое перечисление быстрее обычной итерации?

+1

Это называется быстрым перечислением по какой-либо причине - см .: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html –

ответ

5

Это выше структура языка рычаг, поэтому он может сделать лучше оптимизаций:

Для примера рассмотрим итерацию в NSArray:

for (NSUInteger i = 0; i < [array count]; i++) { 
    id object = [array objectAtIndex:i]; 
} 

Для каждой итерации, есть два метода вызовов. .count - вызов метода. .objectAtIndex - вызов метода. Вызов метода медленный.

Хотя мы можем исправить первое, например.

NSUInteger count = [array count]; 
for (NSUInteger i = 0; i < count; i++) { 

Мы не можем исправить вторую.

Быстрое перечисление может загружать элементы в массив C и быстро перебирать их, без необходимости вызова методов. Кроме того, еще одно большое улучшение заключается в том, чтобы уменьшить проверки, находится ли i внутри границ массива (с for i, которому требуется одно сравнение для каждой итерации!).

Конечно, возможны улучшения, но важно то, что компилятор знает, что мы хотим делать, не говоря о том, как именно мы хотим это сделать. Компилятор может сделать задачу лучше нас.