在......等任何语言中,两个运算符都是<和< =(和它们的对立面)存在。哪个更快,它们是如何解释的?
if(x< = y){blah; }
或
if(x< y + 1){blah; }
答案 0 :(得分:5)
假设没有编译器优化(大假设),第一个将更快,因为< =由单个jle
指令实现,其中后者需要添加后跟jl
指令
http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow#Jump_if_Less
答案 1 :(得分:3)
就性能而言,我根本不担心这一点。以C为例,在一个简单的测试中,我使用GCC 4.5.1定位x86(带-O2
),(x <=y )
操作编译为:
// if (x <= y) {
// printf( "x <= y\n");
// }
//
// `x` is [esp+28]
// `y` is [esp+24]
mov eax, DWORD PTR [esp+24] // load `y` into eax
cmp DWORD PTR [esp+28], eax // compare with `x`
jle L5 // if x < y, jump to the `true` block
L2:
// ...
ret
L5: // this prints "x <= y\n"
mov DWORD PTR [esp], OFFSET FLAT:LC1
call _puts
jmp L2 // jumps back to the code after the ` if statement
和(x < y + 1)
操作编译为:
// if (x < y +1) {
// printf( "x < y+1\n");
// }
//
// `x` is [esp+28]
// `y` is [esp+24]
mov eax, DWORD PTR [esp+28] // load x into eax
cmp DWORD PTR [esp+24], eax // compare with y
jl L3 // jump past the true block if (y < x)
mov DWORD PTR [esp], OFFSET FLAT:LC2
call _puts
L3:
所以你可能会有一个跳跃左右跳跃的差异,但你真的应该只关注这种事情,因为奇怪的时候它确实是一个热点。当然,语言之间可能存在差异,具体情况可能取决于所比较的对象类型。但就性能而言,我仍然不会担心这一点(直到它成为一个已证明的性能问题 - 如果它在我的一生中曾经超过一次或两次,我会感到惊讶。)
所以,我认为担心使用哪种测试的唯一两个理由是:
虽然您可能认为风格/可读性考虑不多,但我确实担心这一点。在我今天的C和C ++代码中,我倾向于使用<
运算符而不是<=
,因为我认为循环使用<
而不是<=
更容易终止'更好'测试。所以,例如:
index < number_of_elements
测试ptr < (array + number_of_elements)
测试实际上即使在C语言中,我现在倾向于使用ptr != (array + number_of_elements)
,因为我已经习惯了<
关系赢得工作的STL迭代器。
事实上,如果我在<=
循环条件下看到for
测试,我会仔细观察 - 通常会有潜伏的错误。我认为这是一种反模式。
<
超过<=
。
答案 2 :(得分:2)
什么数据类型?
如果y
为INT_MAX
,那么第一个表达式为true
,无论x
是什么(假设x
是相同或更小的类型),而第二个表达式始终为false
。
如果答案不正确,你可以更快地得到答案。
答案 3 :(得分:0)
您是否认为这两个论点都不同?如果x和y是浮点数 - 它们可能不会给出相同的结果。这就是比较运算符存在的原因。
答案 4 :(得分:0)
将此视为含糊不清已导致这是一个无法回答的问题。除非您有要测量的软件和硬件,否则无法评估性能 - 使用何种语言?什么语言实现?什么针对CPU架构?等
话虽如此,<=
和<
在性能方面往往相同,因为它们在逻辑上等同于>
和>=
,只是交换目标为基础goto(分支指令),或基础“真/假”评估的交换逻辑。
如果您使用C或C ++编程,编译器可能能够弄清楚您正在做什么,并交换更快的替代方案。
按顺序编写可理解,可维护,正确且高效的代码。为了提高性能,请找到衡量整个程序性能的工具,并明智地花时间。只有在程序足够快的情况下才能优化瓶颈。通过制作更好的代码或制作更酷的功能来节省您节省的时间:)
答案 5 :(得分:0)
喜欢第一个。
在某些具有动态类型的语言中,运行环境必须弄清楚y的类型并执行相应的+运算符。