速度比较运算符

时间:2011-06-18 20:40:03

标签: performance operator-keyword

在......等任何语言中,两个运算符都是<和< =(和它们的对立面)存在。哪个更快,它们是如何解释的?

  

if(x< = y){blah; }

  

if(x< y + 1){blah; }

6 个答案:

答案 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:

所以你可能会有一个跳跃左右跳跃的差异,但你真的应该只关注这种事情,因为奇怪的时候它确实是一个热点。当然,语言之间可能存在差异,具体情况可能取决于所比较的对象类型。但就性能而言,我仍然不会担心这一点(直到它成为一个已证明的性能问题 - 如果它在我的一生中曾经超过一次或两次,我会感到惊讶。)

所以,我认为担心使用哪种测试的唯一两个理由是:

  • 正确性 - 当然,这胜过任何其他考虑因素
  • 风格/ readabilty

虽然您可能认为风格/可读性考虑不多,但我确实担心这一点。在我今天的C和C ++代码中,我倾向于使用<运算符而不是<=,因为我认为循环使用<而不是<=更容易终止'更好'测试。所以,例如:

  • 按索引迭代数组,通常应使用index < number_of_elements测试
  • 使用指向元素的指针迭代数组应使用ptr < (array + number_of_elements)测试

实际上即使在C语言中,我现在倾向于使用ptr != (array + number_of_elements),因为我已经习惯了<关系赢得工作的STL迭代器。

事实上,如果我在<=循环条件下看到for测试,我会仔细观察 - 通常会有潜伏的错误。我认为这是一种反模式。

不,我会批准其中很多内容可能不适用于其他语言,但如果我使用其他语言时出现性能问题,我会感到惊讶,因为我选择使用<超过<=

答案 2 :(得分:2)

什么数据类型?

如果yINT_MAX,那么第一个表达式为true,无论x是什么(假设x是相同或更小的类型),而第二个表达式始终为false

如果答案不正确,你可以更快地得到答案。

答案 3 :(得分:0)

您是否认为这两个论点都不同?如果x和y是浮点数 - 它们可能不会给出相同的结果。这就是比较运算符存在的原因。

答案 4 :(得分:0)

将此视为含糊不清已导致这是一个无法回答的问题。除非您有要测量的软件和硬件,否则无法评估性能 - 使用何种语言?什么语言实现?什么针对CPU架构?等

话虽如此,<=<在性能方面往往相同,因为它们在逻辑上等同于>>=,只是交换目标为基础goto(分支指令),或基础“真/假”评估的交换逻辑。

如果您使用C或C ++编程,编译器可能能够弄清楚您正在做什么,并交换更快的替代方案。

按顺序编写可理解,可维护,正确且高效的代码。为了提高性能,请找到衡量整个程序性能的工具,并明智地花时间。只有在程序足够快的情况下才能优化瓶颈。通过制作更好的代码或制作更酷的功能来节省您节省的时间:)

答案 5 :(得分:0)

喜欢第一个。

在某些具有动态类型的语言中,运行环境必须弄清楚y的类型并执行相应的+运算符。