Скорость сравнения операторов - PullRequest
5 голосов
/ 19 июня 2011

В таких языках, как ... ну что угодно, оба оператора для <и <= (и их противоположности) существуют. Что будет быстрее и как их интерпретируют? </p>

if (x <= y) {бла; } </p>

или

if (x

Ответы [ 6 ]

5 голосов
/ 19 июня 2011

При условии отсутствия оптимизации компилятора (большое предположение), первая будет быстрее, так как <= реализуется одной инструкцией <code>jle, где в качестве последней требуется добавление, за которым следует инструкция jl.

http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow#Jump_if_Less

3 голосов
/ 19 июня 2011

Я бы не стал беспокоиться об этом, если говорить о производительности. Используя 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 test
  • для перебора массива с использованием указателей на элементы следует использовать ptr < (array + number_of_elements) test

На самом деле даже в C сейчас я склонен использовать ptr != (array + number_of_elements), так как я привык к итераторам STL, где победило отношение <.

На самом деле, если я вижу тест <= в циклическом режиме for, я внимательно изучаю - часто скрывается ошибка. Я считаю это анти-паттерном.

Нет, я допускаю, что многое из этого может не подойти для других языков, но я удивлюсь, если при использовании другого языка возникнут проблемы с производительностью, о которых мне придется беспокоиться, потому что я решил использовать < свыше <=.

2 голосов
/ 19 июня 2011

Какой тип данных?

Если y равно INT_MAX, то первое выражение равно true независимо от того, что означает x (при условии, что x - тот же или меньший тип)в то время как второе выражение всегда false.

Если ответ не должен быть правильным, вы можете получить его еще быстрее.

0 голосов
/ 19 июня 2011

Предпочитаю первый.

В некоторых языках с динамическими типами рабочая среда должна выяснить, что является типом y, и выполнить соответствующий оператор +.

0 голосов
/ 19 июня 2011

Если оставить это неопределенным, вы задали этот вопрос без ответа.Производительность не может быть оценена, если у вас нет программного и аппаратного обеспечения для измерения - на каком языке?на каком языке реализация?какая целевая архитектура процессора?и т. д.

При этом и <=, и < часто одинаковы с точки зрения производительности, поскольку они логически эквивалентны > и >=, только с замененными местами назначения для базового перехода (инструкции перехода) или замененная логика для оценки «true / false».

Если вы программируете на C или C ++, компилятор может выяснить, что вы делаете, и поменяться местамив любом случае, более быстрая альтернатива.

Пишите код, понятный, поддерживаемый, правильный и производительный, в таком порядке.Для повышения производительности найдите инструменты для измерения производительности всей вашей программы и тратьте свое время с умом.Оптимизируйте узкие места только до тех пор, пока ваша программа не станет достаточно быстрой.Потратьте время, которое вы экономите, создавая лучший код или делая более интересные функции:)

0 голосов
/ 19 июня 2011

Считаете ли вы, что оба эти аргумента разные?В случае, если x и y являются числами с плавающей запятой - они могут не давать одинаковый результат.Вот почему существуют оба оператора сравнения.

...