Что из следующего быстрее и почему?
CGFloat sum = 0;
for (UIView *v in self.subviews)
sum += v.frame.size.height;
или
CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];
Что из следующего быстрее и почему?
CGFloat sum = 0;
for (UIView *v in self.subviews)
sum += v.frame.size.height;
или
CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];
Действительно, много из того, насколько элегантный (или умный) язык сводится к тому, насколько он избегает циклов. в течении некоторого времени; даже быстрые перечисления - это перетаскивание. Независимо от того, как вы сахарируете их, петли будут блоком кода, который делает что-то, что намного проще описать на естественном языке.
"Получите мне среднюю зарплату всех сотрудников в этом массиве",
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.
Надеюсь, это поможет вам.
Во-первых, ваше выражение KVC не будет работать; KVC не может использоваться для извлечения элементов структуры (за исключением очень ограниченных случаев, когда класс имеет специальную реализацию valueForKey:
, которая выполняет специальную обработку).
Во-вторых, это пахнет преждевременной оптимизацией.
Фактически вы оценили проблему производительности, связанную с этим кодом?
Если нет, вы тратите свое время на "оптимизацию" этого кода.
В стороне, использование KVC для таких операций добавляет значительную хрупкость вашему коду. Компилятор не может проверить выражение, переданное на valueForKey:
, и, таким образом, то, что будет ошибкой или предупреждением времени компиляции, теперь является ошибкой во время выполнения, которая будет найдена только при выполнении этой кодовой страницы.
Также посмотрите в документах Apple:
Хотя ключевое значение кодирования эффективно, оно добавляет уровень косвенности это немного медленнее, чем прямые вызовы метода. Вы должны использовать ключевое значение кодирования только тогда, когда вы можете воспользоваться гибкостью, которая он обеспечивает.