Что будет более эффективным в Java? If-return-else или If-return? - PullRequest
1 голос
/ 13 января 2012

Мне было просто интересно, что на самом деле более эффективно для использования компилятором?

if (condition) {
    return something;
} else {
    dosomething();      
}

OR

if (condition) {
    return something;
}
dosomething();

Я знаю, что это крайне низкие различия и что следует выбирать более читаемую версию, но давайте просто скажем, что мы выполним этот код миллиард раз, какой из них будет более эффективным?

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

Ответы [ 6 ]

6 голосов
/ 13 января 2012

Нет разницы в производительности.Байт-код содержит те же инструкции в том же порядке, действующие на те же данные.

   L0
    LINENUMBER 11 L0
    ICONST_1
    ISTORE 0
   L1
    LINENUMBER 12 L1
    ILOAD 0
    IFEQ L2
   L3
    LINENUMBER 13 L3
    GETSTATIC p/A.something : Ljava/lang/Object;
    ARETURN
   L2
    LINENUMBER 15 L2
   FRAME APPEND [I]
    INVOKESTATIC p/A.dosomething()V
   L4
    LINENUMBER 17 L4
    ACONST_NULL
    ARETURN
   L5
    LOCALVARIABLE condition Z L1 L5 0
    MAXSTACK = 1
    MAXLOCALS = 1

против

   L0
    LINENUMBER 7 L0
    ICONST_1
    ISTORE 0
   L1
    LINENUMBER 8 L1
    ILOAD 0
    IFEQ L2
   L3
    LINENUMBER 9 L3
    GETSTATIC p/B.something : Ljava/lang/Object;
    ARETURN
   L2
    LINENUMBER 11 L2
   FRAME APPEND [I]
    INVOKESTATIC p/B.dosomething()V
   L4
    LINENUMBER 12 L4
    ACONST_NULL
    ARETURN
   L5
    LOCALVARIABLE condition Z L1 L5 0
    MAXSTACK = 1
    MAXLOCALS = 1

public class A {
    static Object something = new Object();
    public static void main(String[] args) { 
        test(); 
    }
    private static Object test() {
        boolean condition = true;
        if (condition) {
            return something;
        } else {
            dosomething();
        }
        return null;
    }
    private static void dosomething() {}
}

против

public class B {
    static Object something = new Object();
    public static void main(String[] args) { 
        test(); 
    }
    private static Object test() {
        boolean condition = true;
        if (condition) { 
            return something; 
        }
        dosomething();
        return null;
    }
    private static void dosomething() {}
}
2 голосов
/ 13 января 2012

Нет никакой разницы в двух версиях.Только те различия, которые могут быть, являются чисто с точки зрения читабельности.

Если вы применяете стиль, в котором проверки выполняются в начале функции, а возврат выполняется в кратчайшие возможные сроки, появляется вторая.

void foo()
{
   if (condition1)
      return;
   if (goo())
      return;
   //...
}

В противном случае первая версия обеспечивает более заметное ветвление.

1 голос
/ 13 января 2012

Я сомневаюсь, что есть большая разница в производительности, но я предпочитаю второе, так как первое может привести к адскому отступу.

Даже если выполнить этот код миллиард раз, doSomething() почти наверняка затмит if/else с точки зрения затраченного времени.

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

Неразборчивый код является гораздо более серьезной проблемой, чем слегка медленный код: -)

1 голос
/ 13 января 2012

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

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

1 голос
/ 13 января 2012

Это не будет иметь существенного значения вообще.Поймите, что else не оценивает другое выражение, а просто говорит, что если исходное условие ложно, сделайте это.Condition все еще оценивается в обоих направлениях.

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

0 голосов
/ 13 января 2012

Я считаю, что это просто личное предпочтение.

Еще несколько информационных ответов можно найти на этом вопросе

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