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



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



о себе:



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


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



int x = (expression) ? 1 : 2;
1384   5  

5 ответов:

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

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

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

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

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

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

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

просто добавить ко всем другим ответам:

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

Comments

    Ничего не найдено.