关于c ++:哪种更快(x <0)或(x == -1)?

What is faster (x < 0) or (x == -1)?

变量x为int,可能的值为:-1, 0, 1, 2, 3。哪个表达式更快(以CPU计时周期为单位):

1
2
1. (x < 0)
2. (x == -1)

语言:C/C++,但我想所有其他语言都会有相同的语言。

另外,我个人认为答案是(x < 0)

更广泛地说,对于古鲁来说,如果x-12^30呢?


这完全取决于您为其编译的ISA以及编译器优化器的质量。不要过早地优化:首先分析以找出瓶颈。

也就是说,在x86中,在大多数情况下,您会发现两者速度相同。在这两种情况下,您都有一个比较(cmp和一个条件跳转(jCC指令)。但是,对于(x < 0)来说,有些情况下编译器可以省略cmp指令,从而将代码加速一个完整的周期。

具体地说,如果值x存储在寄存器中,并且最近是在eflags寄存器中设置符号标志sf的算术运算(如addsub的结果,但还有更多的可能性),则不需要cmp指令,编译器只会发出EDOCX1。〔8〕指示。没有简单的jCC指令在输入为-1时跳转。


为什么?无论您使用哪种方法,编译器都会在当前编译的任何平台上对其进行优化。

如果你需要检查它是否是-1,使用(x=-1),如果你想知道它是否小于零,使用那个。写下你会大声读出的内容。

像这样的小东西不会使任何东西更快,你应该担心可读性和干净的设计,而不是哪个小操作更快。

即使它不做任何逻辑更改,也有可能是在您的平台上,两个都将在一个CPU周期内执行。


试试看!做一百万次,或者更好,每次做十亿次。我敢打赌在你的结果中没有统计意义,但是谁知道——也许在你的平台和编译器上,你会找到一个结果。

这是一个伟大的实验,可以让你自己相信过早的优化可能不值得你花时间——而且很可能是"万恶之源——至少在编程中是这样的"。


x<0会更快。如果没有其他内容,它将阻止作为操作数提取常量-1。大多数体系结构都有专门的指令来与零进行比较,这样也会有所帮助。


这可能取决于比较之前的操作或成功的操作。例如,如果在进行比较之前将值赋给X,则检查符号标志可能比比较特定值更快。或者CPU的分支预测性能可能会受到所选比较的影响。

但是,正如其他人所说,这取决于CPU体系结构、内存体系结构、编译器和许多其他东西,因此没有一般的答案。


这两个操作都可以在一个CPU步骤中完成,因此它们应该具有相同的性能。


不管怎样,重要的考虑是,这实际上指导了您的程序流,并且恰好产生了相同的结果?

如果x实际上是和索引或枚举中的一个值,那么-1总是您想要的,还是任何负值都有效?现在,-1是唯一的负值,但这可能会改变。


你甚至不能断章取义地回答这个问题。如果您尝试使用一个小的微基准,那么优化器完全有可能将您的代码放入以太中:

1
2
3
4
5
6
7
// Get time
int x = -1;
for (int i = 0; i < ONE_JILLION; i++) {
    int dummy = (x < 0); // Poof!  Dummy is ignored.
}
// Compute time difference - in the presence of good optimization
// expect this time difference to be close to useless.


尼古拉,你写道:

It's actually bottleneck operator in
the high-load program. Performance in
this 1-2 strings is much more valuable
than readability...

All bottlenecks are usually this
small, even in perfect design with
perfect algorithms (though there is no
such). I do high-load DNA processing
and know my field and my algorithms
quite well

如果是,为什么不下一步呢?

  • 获取计时器,设置为0;
  • 用(x<0)编译高负载程序;
  • 启动程序和计时器;
  • 在程序结束时,查看计时器并记住结果1。
  • 同1;
  • 用(x=-1)编译高负载程序;
  • 同3;
  • 在程序结束时,查看计时器并记住结果2。
  • 比较结果1和结果2。
  • 你会得到答案的。


    我相信你相信这是一个真正的接受者。

    我想问机器会比我们任何人都给出更可靠的答案。

    我发现,即使是在你所说的代码中,我认为我知道时间的去向并不完全正确。例如,如果这是在一个内部循环中,如果有任何类型的函数调用,甚至是编译器插入的一个不可见的函数调用,那么到目前为止,该调用的开销将占主导地位。


    正如其他人所说,可能没有什么区别。比较是CPU中的基本操作,芯片设计者希望尽可能快地进行比较。

    但你可以考虑其他的事情。分析每个值的频率,并按该顺序进行比较。这样可以节省很多周期。当然,您仍然需要将代码编译到ASM来验证这一点。


    这取决于体系结构,但是x=-1更容易出错。X<0是前进的道路。


    同样,两个操作通常在1个时钟内完成。