有人能解释一下使用'<'更高效(性能明智)吗?或者在for循环中'!='?
for(int i = 0; i < [object count]; ++i) {
/**/
}
或
for(int i = 0; i != [object count]; ++i) {
/**/
}
我记得我读到某个地方“!=”比“&lt;”表现得更好......不是吗?
答案 0 :(得分:3)
初学者节省纳秒,真正的程序员可以节省微秒。
首先,[object count]返回NSUInteger。如果您已经在Xcode中打开了警告,那么您将收到两个警告:一个用于比较有符号和无符号,另一个是因为如果使用超过20亿的数组,则int可能不足以容纳所有值元素。这也意味着我必须在每次迭代时扩展到64位,这比由&lt; vs!=
其次,[对象计数]是方法调用。所以你问我们如何削减一个纳秒的时间,并且你通过循环的每一次迭代都在进行方法调用。你这样做的时间减少了100倍。所以如果你担心速度,请写
NSUInteger count = object.count;
for (NSUInteger i = 0; i < count; ++i) ...
第三,当您使用数组时,您应该使用快速枚举器。
for (id whatever in object) ...
会再快得多,因为您不需要每次都访问该阵列。
第四个也是最后一个,规则是:如果你没有测量它,你就不会知道什么是更快的,如果你懒得测量它,那么我们可以假设它没有&# 39;实际上很重要。
答案 1 :(得分:2)
就性能而言,它应该对大多数架构没有影响(参见this answer to a very similar question)。当然理论上<
可能比!=
慢,但实际上它在编译时已经过优化,循环中的任何内容都会使任何增益可以忽略不计,特别是考虑到下文无限循环下划线的风险。
就功能而言,它是不同的,特别是如果由于某种原因在您的循环中编辑i
。这就是为什么我说<
更安全,因为在对象计数之上的任何i
都会停止循环,而使用!=
则会冒一个永无止境的循环。
答案 2 :(得分:0)
就性能而言,它们似乎是相同的,gcc将其编译为类似的结构,只需在比较后检查不同的标志:
低于或等于:
0004 C745F800 movl $0, -8(%rbp)
000000
000b EB04 jmp .L2
.L3:
000d 8345F801 addl $1, -8(%rbp)
.L2:
0011 837DF804 cmpl $4, -8(%rbp)
0015 7EF6 jle .L3
不相等:
0017 C745FC00 movl $0, -4(%rbp)
000000
001e EB04 jmp .L4
.L5:
0020 8345FC01 addl $1, -4(%rbp)
.L4:
0024 837DFC05 cmpl $5, -4(%rbp)
0028 75F6 jne .L5