Подтвердить что ты не робот

Производительность: больше/меньше, чем vs, не равная

Интересно, есть ли разница в производительности между

проверка, если значение больше/меньше другого

for(int x = 0; x < y; x++); // for y > x

и

проверка, если значение не равно другому

for(int x = 0; x != y; x++); // for y > x

и почему?

Кроме того: что, если я сравню с нолем, есть ли еще разница?

Было бы неплохо, если бы ответы также рассмотрели асеблированный вид кода.

EDIT: Поскольку большинство из вас указало, что разница в производительности, конечно, ничтожно мала, но меня интересует разница на уровне процессора. Какая операция сложнее?

Мне больше нужен вопрос, чтобы узнать/понять технику.

Я удалил тег Java, который я случайно добавил, потому что вопрос был в основном рассчитан не только на Java, извините.

4b9b3361

Ответ 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++) {}    
}