Подтвердить что ты не робот

Почему один "если" медленнее, чем "переключатель"?

Возможный дубликат:
Какова относительная разница в производительности if/else или оператора switch в Java?

Учитывая следующие два метода:

public static int useSwitch(int i) {
    switch (i) {
    case 0:
        return 1;
    default:
        return 0;
    }
}

public static int useIf(int i) {
    if (i == 0)
        return 1;
    return 0;
}

тестирование показывает, что switch выполняется немного быстрее (1,4 нс на один вызов на моей машине), чем версия if.

Я всегда считал, что преимущество переключателя не срабатывало, пока не удалось избежать хотя бы нескольких ifs,

Почему switch быстрее, чем один if?

4b9b3361

Ответ 1

Проверяя байт-код, результат будет таким, как ожидалось:

ПЕРЕКЛЮЧАТЕЛЬ

public static useSwitch(I)I
 L0
  ILOAD 0
  TABLESWITCH
    0: L1
    default: L2
 L1
  INVOKESTATIC Tests.a()I
  IRETURN
 L2
  INVOKESTATIC Tests.b()I
  IRETURN

IF

public static useIf(I)I
 L0
  ILOAD 0
  IFNE L1
 L2
  INVOKESTATIC Tests.a()I
  IRETURN
 L1
  INVOKESTATIC Tests.b()I
  IRETURN

Теперь я не вижу какой-либо особой причины, по которой вы должны быть медленнее, чем другая (а не значительная сумма в любом случае). Это, безусловно, то, что связано с конкретной реализацией JVM и тем, как она выполняет эти коды операций. По общему знанию, инструкция TABLESWITCH должна быть медленнее, если нет достаточных случаев, которые делают ее конструкцию ценной, но это всего лишь общее мышление. Каждый JVM мог реализовать его по-другому, так что это просто предположение.

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

Ответ 2

Этот тип сравнения анализируется в If-else vs switch - что лучше?. Однако попытайтесь скомпилировать собственный код с помощью gcj и сравнить полученные результаты с результатом использования байт-кода.