Я бы не стал беспокоиться об этом, если говорить о производительности. Используя 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
, я внимательно изучаю - часто скрывается ошибка. Я считаю это анти-паттерном.
Нет, я допускаю, что многое из этого может не подойти для других языков, но я удивлюсь, если при использовании другого языка возникнут проблемы с производительностью, о которых мне придется беспокоиться, потому что я решил использовать <
свыше <=
.