13

以下哪个更快,为什么?

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

或者

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

3 回答 3

14

确实,一种语言的优雅(或聪明)很大程度上取决于它避免循环的能力。为,而;即使是快速枚举表达式也很麻烦。无论你如何粉饰它们,循环都将是一段代码,它执行的操作用自然语言描述起来要简单得多。

“给我这个数组中所有员工的平均工资”,

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

相对...

幸运的是,Key-Value Coding 为我们提供了一种更简洁(几乎类似于 Ruby)的方式来执行此操作:

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

KVC 集合运算符允许使用valueForKeyPath:中的键路径表示法对集合执行操作。

每当您在键路径中看到@时,它表示一个特定的聚合函数,其结果可以返回或链接,就像任何其他键路径一样。

快速枚举比 KVC 更快。

希望它可以帮助你。

于 2013-05-02T12:05:03.690 回答
6

首先,您的 KVC 表达式不起作用;KVC 不能用于检索结构成员(除了非常有限的情况,即类具有特殊实现的valueForKey:特殊处理)。

其次,这听起来像是过早的优化。

您是否真的量化了与此代码相关的性能问题?

如果没有,您就是在浪费时间“优化”此代码路径。

除此之外,使用 KVC 进行此类操作会给您的代码增加相当大的脆弱性。编译器无法验证传递给的表达式valueForKey:,因此,编译时错误或警告现在是运行时错误,只有在执行该代码路径时才会发现。

于 2013-05-02T17:25:50.203 回答
0

还可以查看 Apple 文档:

尽管键值编码很有效,但它增加了一个比直接方法调用稍慢的间接级别。只有当您可以从它提供的灵活性中受益时,您才应该使用键值编码。

键值编码文档

于 2013-05-02T12:42:20.847 回答