Java неявно проверяет> и == когда> = выполняется? - PullRequest
0 голосов
/ 12 апреля 2020

Когда я использую "> =" в коде, Java автоматически проверяет "==" и ">"?

Причина, по которой я задаю этот вопрос, заключается в том, что в для l oop например:

for(int i = 0; i<N; i++){
    if(a > b) //do something
    else if(a == b) //do something different
}

было бы эффективнее сделать

for(int i = 0; i<N; i++){
    if(a >= b){
        if(a > b) //do something
        else // do the thing you would do for a == b
    }
}

, если a> = b не проверяет a == b и a> b отдельно.

Причина этого в том, что во втором для l oop вы проверяете условия 1 или 2 раза, в то время как в первом для l oop вы всегда проверяете условия 2 раза.

Я понимаю, что разница во времени ничтожно мало, но мне просто любопытно.

Ответы [ 3 ]

3 голосов
/ 12 апреля 2020

Виртуальная машина Java имеет отдельные инструкции if_icmpeq (равно), if_icmpge (больше или равно) и if_icmpgt (больше) для двух случаев. Будет ли он более эффективным, зависит от архитектуры процессора; x86 имеет одну JGE (переход, если больше или равно) инструкция.

0 голосов
/ 12 апреля 2020

На самом фундаментальном уровне сравнение - это просто вычитание, за которым следует проверка результата. Процессоры устанавливают флаги после арифметических c операций: переполнение и ноль относятся к сравнениям. Переполнение (ov) устанавливается, если результат отрицательный, и ноль (z) устанавливается, если операнды были равны. Так что 1 < 2 будет переводиться в (1 - 2), что приведет к ov: 1 и z: 0.

Требуемые комбинации значений флагов можно проверить в одной операции:

  • Меньше чем: ov: 1 и z: 0
  • Меньше или равно: ov : 1 или z: 1
  • равно: z: 1
  • больше или равно: ov: 0 или z: 1
  • больше: ov: 0 и z: 0

Итак, при достойной реализации JVM вы обнаружите, что между > и >=

нет заметной разницы в производительности.
0 голосов
/ 12 апреля 2020

Как показывает предыдущий ответ, это зависит от архитектуры системы, но в целом общая оценка «больше» или «равно» - это два условия, разделенных «или». Даже если мы предположим, что сравнение не будет выполнять два условия по отдельности, ваши рассуждения все еще ложны.
Если в действительности мы имеем «a> b»
Для первого l oop, мы сравним 1 условие «>».
Для второго l oop, мы сравним 2 раза, один для первого условия «неделимый> =» и один для «>»
Так что два l oop эквивалентны, и это Лучше выбрать в зависимости от видимости, которую вы хотите, и полезности, которая вам нужна. Но два одинаковых в среднем сравнений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...