以下哪项更快,为什么?
CGFloat sum = 0;
for (UIView *v in self.subviews)
sum += v.frame.size.height;
或
CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];
答案 0 :(得分:12)
真的,很多优雅(或聪明)的语言归结为它如何避免循环。 for; while;甚至快速枚举表达式都是拖累。无论你如何对它们进行糖衣,循环都将是一段代码,它可以用自然语言来描述更简单的东西。
“告诉我这个阵列中所有员工的平均工资”,
double totalSalary = 0.0;
for (Employee *employee in employees) {
totalSalary += [employee.salary doubleValue];
}
double averageSalary = totalSalary / [employees count];
...对比
幸运的是,键值编码为我们提供了一种更为简洁 - 几乎类似Ruby的方式 - :
[employees valueForKeyPath:@"@avg.salary"];
KVC Collection Operators允许使用 valueForKeyPath:中的键路径表示法对集合执行操作。
每次在密钥路径中看到 @ 时,它都表示一个特定的聚合函数,其结果可以返回或链接,就像任何其他密钥路径一样。
快速枚举比KVC更快。
希望它对你有所帮助。
答案 1 :(得分:6)
首先,你的KVC表达不起作用; KVC不能用于检索struct成员(除了非常有限的情况,其中一个类有一个特殊的valueForKey:
实现进行特殊处理)。
其次,这就像过早优化一样。
您是否实际量化了与此代码相关的性能问题?
如果没有,您就是在浪费时间“优化”此代码路径。
除此之外,使用KVC进行此类操作会给代码带来相当大的脆弱性。编译器无法验证传递给valueForKey:
的表达式,因此,编译时错误或警告现在是运行时的错误,只有在执行该代码路径时才会发现错误。
答案 2 :(得分:0)