In C++, which is better i>-1 or i>=0
这可能是一个愚蠢的问题,但这种优化有时会提高应用程序的性能。这里我特别要求C++,因为C++编译代码的方式与C++或Java有很大的不同。
问题是,如果变量i是int,那么哪个执行得更好。
i > -1
i >= 0
我在寻找性能方面的内存块或寄存器所需的和CPU周期所需的两个条件。
事先谢谢。
- 在性能方面完全没有区别。但您知道,您可以自己检查生成的程序集,并在询问之前对其进行基准测试。
- 生成的程序集代码几乎相同。我觉得这里没有什么不同。
- 看看这个。
- 微观优化是万恶之源。
- 很大程度上取决于指令集。有些有针对零测试的特殊说明。
- 也请检查:stackoverflow.com/questions/14520830/…
- 这取决于i是否为整数!
- 我确实是整数。
在汇编语言中,两者都在同一结构上:
i > -1
1 2
| cmp [register with i value],-1
jg [somewhere] |
i >= 0
1 2
| cmp [register with i value],0
jge [somewhere] |
根据使用的跳转标志,指令jg进行两个标志比较(zf=0和sf=of),但jge只做一个标志比较(sf=of)。
所以我想说,两者使用几乎相同的寄存器和CPU周期,对i >= 0可能有一个更快的比较。
- 即使是2个标志比较而不是1个标志比较也需要相同的循环数,不是吗?
- @我不这么认为。在编程代码中取同样的例子:if (something)和if (something && something_else)之间的速度慢了多少?
- 加载即时值-1可能会更昂贵或需要更多的字节。不清楚,JIT是否优化了一种形式到另一种形式。
- @USR编号:intel.com/content/dam/www/public/us/en/documents/manuals/…每个JCC(跳转条件)都分组在附录C的延迟/吞吐量表中。
- @我说的是加载常数-1,而不是跳跃。显然,所有的跳跃和比较都有相同的成本(一个很小的成本)。
- 在机器代码中,-1和0都将接受一个字节。字节是从内存中完全读取的,占用的时间非常相同(相同的指令)。如果你比某个超过255岁的人要花更长的时间
好吧,根据逻辑>操作可能比>=便宜,但我猜你是在启用优化选项的情况下编译的,所以编译器可能会做他想优化代码的任何事情,所以我想说这没关系,即使一个程序真的更快,也可能是编译器将其更改为最佳选项。
在编写for循环时,将其从for (i = 0; i < 1000; i++)转换为for (i = 1000; i > 0; i--)可能会很有好处,因为在某些体系结构中,编译器可以跳过比较指令,因为当我达到0时将设置一个标志。关于现代建筑,我不确定它是否重要。