Подтвердить что ты не робот

KVC против быстрого перечисления

Что из следующего быстрее и почему?

CGFloat sum = 0;
for (UIView *v in self.subviews)
    sum += v.frame.size.height;

или

CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];
4b9b3361

Ответ 1

Действительно, много из того, насколько элегантный (или умный) язык сводится к тому, насколько он избегает циклов. в течении некоторого времени; даже быстрые перечисления - это перетаскивание. Независимо от того, как вы сахарируете их, петли будут блоком кода, который делает что-то, что намного проще описать на естественном языке.

"Получите мне среднюю зарплату всех сотрудников в этом массиве",

double totalSalary = 0.0;
for (Employee *employee in employees) {
  totalSalary += [employee.salary doubleValue];
}
double averageSalary = totalSalary / [employees count];

по сравнению с...

К счастью, Key-Value Coding дает нам гораздо более сжатый, почти рубиновый способ:

[employees valueForKeyPath:@"@avg.salary"];

Операторы коллекции KVC позволяют выполнять действия над коллекцией, используя нотацию ключа в valueForKeyPath:.

Каждый раз, когда вы видите @ в ключевом пути, он обозначает определенную агрегированную функцию, результат которой может быть возвращен или скован, как и любой другой путь ключа.

Быстрое перечисление быстрее, чем KVC.

Надеюсь, это поможет вам.

Ответ 2

Во-первых, ваше выражение KVC не будет работать; KVC не может использоваться для извлечения элементов структуры (за исключением очень ограниченных случаев, когда класс имеет специальную реализацию valueForKey:, которая выполняет специальную обработку).

Во-вторых, это пахнет преждевременной оптимизацией.

Фактически вы оценили проблему производительности, связанную с этим кодом?

Если нет, вы тратите свое время на "оптимизацию" этого кода.

В стороне, использование KVC для таких операций добавляет значительную хрупкость вашему коду. Компилятор не может проверить выражение, переданное на valueForKey:, и, таким образом, то, что будет ошибкой или предупреждением времени компиляции, теперь является ошибкой во время выполнения, которая будет найдена только при выполнении этой кодовой страницы.

Ответ 3

Также посмотрите в документах Apple:

Хотя ключевое значение кодирования эффективно, оно добавляет уровень косвенности это немного медленнее, чем прямые вызовы метода. Вы должны использовать ключевое значение кодирования только тогда, когда вы можете воспользоваться гибкостью, которая он обеспечивает.

Документы для кодирования ключевых значений