Я знаю, что быстрое перечисление и цель в объекте C. Я хочу знать, почему быстрое перечисление происходит быстрее, чем обычная итерация?Почему быстрое перечисление быстрее обычной итерации?
ответ
Это выше структура языка рычаг, поэтому он может сделать лучше оптимизаций:
Для примера рассмотрим итерацию в 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
, которому требуется одно сравнение для каждой итерации!).
Конечно, возможны улучшения, но важно то, что компилятор знает, что мы хотим делать, не говоря о том, как именно мы хотим это сделать. Компилятор может сделать задачу лучше нас.
Это называется быстрым перечислением по какой-либо причине - см .: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html –