我知道什么是快速枚举以及它在Objective-C中的作用。我想知道为什么快速枚举比正常迭代更快?
我知道什么是快速枚举以及它在Objective-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
!)。
当然,还有更多可能的改进,但重要的是让编译器知道我们想做什么,而不是告诉它我们想如何做到这一点。编译器可以比我们做得更好。