Какая "if" конструкция быстрее - оператор или тройной оператор?

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

утверждение:

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

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

int x = (expression) ? 1 : 2;

Ответ 1

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

Иногда оператор 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 в выигрыше или нет (в отличие от моей предыдущей чрезвычайно ошибочной попытки:), но я был бы очень удивлен, если бы JITTER закончил с другой собственный код.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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