是'<'比'!='效率更高

时间:2015-03-25 14:27:56

标签: objective-c performance assembly

有人能解释一下使用'<'更高效(性能明智)吗?或者在for循环中'!='?

for(int i = 0; i < [object count]; ++i) {
    /**/
}

for(int i = 0; i != [object count]; ++i) {
    /**/
}

我记得我读到某个地方“!=”比“&lt;”表现得更好......不是吗?

3 个答案:

答案 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