TL;DR
这四个操作员之间似乎几乎没有区别,因为对我来说,它们的执行时间几乎相同(在不同的系统上可能会有所不同!)。因此,当有疑问时,只需使用对情况最有意义的运算符(尤其是在使用 C++ 时)。
所以,事不宜迟,这里是长解释:
假设整数比较:
就生成的程序集而言,结果取决于平台。在我的电脑上(Apple LLVM Compiler 4.0, x86_64),结果(生成的程序集如下):
a < b (uses 'setl'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setl %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
a <= b (uses 'setle'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setle %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
a > b (uses 'setg'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setg %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
a >= b (uses 'setge'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setge %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
这并不能告诉我太多。所以,我们跳到一个基准:
女士们先生们,结果出来了,我创建了以下测试程序(我知道“时钟”不是计算这样的结果的最佳方法,但现在必须这样做)。
#include <time.h>
#include <stdio.h>
#define ITERS 100000000
int v = 0;
void testL()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++) {
v = i < v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
void testLE()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++)
{
v = i <= v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
void testG()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++) {
v = i > v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
void testGE()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++) {
v = i >= v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
int main()
{
testL();
testLE();
testG();
testGE();
}
在我的机器上(使用 -O0 编译),给了我这个(5 次单独运行):
测试号:337848
测试LE:338237
测试G:337888
测试GE:337787
测试号:337768
测试LE:338110
测试G:337406
测试GE:337926
测试号:338958
测试LE:338948
测试G:337705
测试GE:337829
测试号:339805
测试LE:339634
测试G:337413
测试GE:337900
测试L:340490
测试LE:339030
测试G:337298
测试GE:337593
我认为这些运算符之间的差异充其量是很小的,在现代计算世界中并没有太大的影响。