Производительность: больше/меньше, чем vs, не равная
Интересно, есть ли разница в производительности между
проверка, если значение больше/меньше другого
for(int x = 0; x < y; x++); // for y > x
и
проверка, если значение не равно другому
for(int x = 0; x != y; x++); // for y > x
и почему?
Кроме того: что, если я сравню с нолем, есть ли еще разница?
Было бы неплохо, если бы ответы также рассмотрели асеблированный вид кода.
EDIT:
Поскольку большинство из вас указало, что разница в производительности, конечно, ничтожно мала, но меня интересует разница на уровне процессора. Какая операция сложнее?
Мне больше нужен вопрос, чтобы узнать/понять технику.
Я удалил тег Java
, который я случайно добавил, потому что вопрос был в основном рассчитан не только на Java, извините.
Ответы
Ответ 1
Вы все равно должны делать то, что яснее, безопаснее и понятнее. Эти обсуждения с использованием микронастройки обычно являются пустой тратой времени, потому что
- они редко делают измеримую разницу
- когда они имеют значение, это может измениться, если вы используете другой JVM или процессор. т.е. без предупреждения.
Примечание: сгенерированная машина также может изменяться с процессором или JVM, поэтому просмотр этого не очень помогает в большинстве случаев, даже если вы хорошо знакомы с ассемблерным кодом.
Что гораздо важнее, так это ремонтопригодность программного обеспечения.
Ответ 2
Производительность абсолютно ничтожная. Вот несколько примеров, чтобы доказать это:
public class OpporatorPerformance {
static long y = 300000000L;
public static void main(String[] args) {
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
}
public static long testOne() {
Date newDate = new Date();
int z = 0;
for(int x = 0; x < y; x++){ // for y > x
z = x;
}
return new Date().getTime() - newDate.getTime();
}
public static long testTwo() {
Date newDate = new Date();
int z = 0;
for(int x = 0; x != y; x++){ // for y > x
z = x;
}
return new Date().getTime() - newDate.getTime();
}
}
Результаты:
Test One: 342
Test Two: 332
Test One: 340
Test Two: 340
Test One: 415
Test Two: 325
Test One: 393
Test Two: 329
Ответ 3
Редко бывает поражение, но первое гораздо надежнее, поскольку оно будет обрабатывать оба необычных случая, когда
- y < 0 для запуска
- x или y запутываются внутри блока.
Ответ 4
Интересно, вложен ли для каждого теста те же результаты?
for(int x = 0; x < y; x++)
{
for(int x2 = 0; x2 < y; x2++) {}
}
for(int x = 0; x != y; x++)
{
for(int x2 = 0; x2 != y; x2++) {}
}