Какая конструкция «если» быстрее - оператор или троичный оператор? - PullRequest
82 голосов
/ 16 января 2011

Существует два типа операторов if в java - классические: if {} else {} и стенография: exp ? value1 : value2.Один быстрее другого или они одинаковые?

оператор:

int x;
if (expression) {
  x = 1;
} else {
  x = 2;
}

троичный оператор:

int x = (expression) ? 1 : 2;

Ответы [ 5 ]

105 голосов
/ 16 января 2011

Там есть только один тип выражения "если". Другое является условным выражением. Что касается того, что будет работать лучше: они могут компилироваться в один и тот же байт-код, и я ожидаю, что они будут вести себя одинаково - или настолько близко, что вы определенно не захотите выбирать один из них с точки зрения производительности.

Иногда оператор if будет более читабельным, иногда условный оператор будет более читабельным. В частности, я бы рекомендовал использовать условный оператор, когда два операнда просты и не имеют побочных эффектов, тогда как, если основная цель двух ветвей - их побочных эффектов, я бы, вероятно, использовал if заявление.

Вот пример программы и байт-код:

public class Test {
    public static void main(String[] args) {
        int x;
        if (args.length > 0) {
            x = 1;
        } else {
            x = 2;
        }
    }

    public static void main2(String[] args) {
        int x = (args.length > 0) ? 1 : 2;
    }
}

Байт-код декомпилируется с javap -c Test:

public class Test extends java.lang.Object {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1
       4: return

  public static void main(java.lang.String[]
    Code:
       0: aload_0
       1: arraylength
       2: ifle          10
       5: iconst_1
       6: istore_1
       7: goto          12
      10: iconst_2
      11: istore_1
      12: return

  public static void main2(java.lang.String[
    Code:
       0: aload_0
       1: arraylength
       2: ifle          9
       5: iconst_1
       6: goto          10
       9: iconst_2
      10: istore_1
      11: return
}

Как вы можете видеть, здесь есть небольшая разница в байт-коде - происходит ли istore_1 в пределах brance или нет (в отличие от моей предыдущей чрезвычайно ошибочной попытки :), но я был бы очень удивлен если JITter оказался с другим собственным кодом.

10 голосов
/ 16 января 2011

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

Если бы была разница в скорости выполнения, вы все равно должны использовать самую идиоматическую версию (которая будет второй для назначения одной переменной на основе простого условия и двух простых подвыражений и первой для выполнения более сложные операции или операции, которые не помещаются на одной строке).

8 голосов
/ 16 января 2011

Это то же самое.Оба они довольно быстрые, обычно около 10-30 наносекунд.(в зависимости от схемы использования) Это время важно для вас?

Вы должны делать то, что считаете наиболее ясным.

4 голосов
/ 16 января 2011

Просто добавьте ко всем остальным ответам:

Второе выражение часто называют третичным / троичным оператором / оператором.Это может быть очень полезно, потому что возвращает выражение.Иногда это делает код более понятным для типичных коротких операторов.

3 голосов
/ 16 января 2011

нет - они будут скомпилированы в одно и то же.

...