在 C++ 中,i>-1 或 i>=0 哪个更好
In C++, which is better i>-1 or i>=0
这可能是个愚蠢的问题,但这种优化有时会提高应用程序的性能。
在这里我特别要求 C++,因为 C++ 编译代码的方式与 c# 或 Java.
有很大不同
问题是如果变量 i 是 int,哪个表现更好。
i > -1
i >= 0
我正在寻找所需的内存块或寄存器以及两种条件所需的 CPU 个周期方面的性能。
提前致谢。
嗯,根据逻辑 > 操作可能 "cheaper" 而不是 >=,但我猜你在编译时启用了优化选项,所以编译器可能会做任何他想做的事情来优化你的代码,所以我会说那没关系,即使一个真的更快,也可能编译器将其更改为最佳选择
在汇编语言中,两者在相同的结构上:
i > -1
cmp [register with i value],-1
jg [somewhere]
i >= 0
cmp [register with i value],0
jge [somewhere]
根据 used jump flags,指令 jg
进行两个标志比较(ZF = 0 和 SF = OF),但 jge
只进行一次比较(SF = OF)。
所以我很想说两者使用几乎相同的寄存器和 CPU 周期,i >= 0
.
的比较可能要快一些
编写 for 循环时,将其从 for (i = 0; i < 1000; i++)
转换为 for (i = 1000; i > 0; i--)
可能会有所帮助,因为在某些体系结构上,编译器可以跳过比较指令,因为当 i 达到 0 时将设置一个标志. 在现代建筑上我不确定它是否重要。
这可能是个愚蠢的问题,但这种优化有时会提高应用程序的性能。 在这里我特别要求 C++,因为 C++ 编译代码的方式与 c# 或 Java.
有很大不同问题是如果变量 i 是 int,哪个表现更好。
i > -1
i >= 0
我正在寻找所需的内存块或寄存器以及两种条件所需的 CPU 个周期方面的性能。
提前致谢。
嗯,根据逻辑 > 操作可能 "cheaper" 而不是 >=,但我猜你在编译时启用了优化选项,所以编译器可能会做任何他想做的事情来优化你的代码,所以我会说那没关系,即使一个真的更快,也可能编译器将其更改为最佳选择
在汇编语言中,两者在相同的结构上:
i > -1
cmp [register with i value],-1 jg [somewhere]
i >= 0
cmp [register with i value],0 jge [somewhere]
根据 used jump flags,指令 jg
进行两个标志比较(ZF = 0 和 SF = OF),但 jge
只进行一次比较(SF = OF)。
所以我很想说两者使用几乎相同的寄存器和 CPU 周期,i >= 0
.
编写 for 循环时,将其从 for (i = 0; i < 1000; i++)
转换为 for (i = 1000; i > 0; i--)
可能会有所帮助,因为在某些体系结构上,编译器可以跳过比较指令,因为当 i 达到 0 时将设置一个标志. 在现代建筑上我不确定它是否重要。