Быстрее ли использовать switch / if или вложенные тернарные операторы?

1

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

switch (type) {
    case INCREASING: 
        if (currentVal >= duration) { done = true; }
        break;
    case DECREASING:
        if (currentVal <= 0) { done = true; }
        break;
    default: 
        done = false;
        break;
    }

или

done = (type == INCREASING ? currentVal >= duration ? true : false : false) || (type == DECREASING ? currentVal <= 0 ? true : false : false);

с

public static final int INCREASING = 1;
public static final int DECREASING = -1;
private float currentVal;
private float duration; //is set in the constructur
private boolean done = false;

Они оба делают то же самое с точки зрения того, чего я хочу достичь. Я просто подумал, что оператор switch может быть немного быстрее, потому что он не проверяет все? Мне нравится преимущество иметь его в одной строке, хотя так разница действительно стоит рассмотреть?

  • 8
    оператор switch определенно более читабелен.
  • 8
    Не преждевременно оптимизируйте свой код. Используйте более читаемое решение.
Показать ещё 6 комментариев
Теги:
performance

4 ответа

9
Лучший ответ

Третий вариант:

done = (type == INCREASING && currentVal >= duration) ||
       (type == DECREASING && currentVal <= 0);

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

  • 0
    Не думал об этом, похоже, хороший компромисс
  • 1
    +1 для скобок вокруг обоих условий; они не только делают код более читабельным, но и предотвращают ошибки ассоциативности / OoP. еще один ментал +1 за упоминание о том, что преждевременность - это всегда плохо. Делает веселье короче смешок ИМО
1

Это не "ответ"; но просто точка зрения, которая не в состоянии вставить комментарий.


Я бы, скорее всего, написал это так:

if (type == INCREASING && currentVal >= duration) {
    done = true;
} else if (type == DECREASING && currentVal <= 0) {
    done = true;
}

Нет else/done = false, потому что если он очищен, это похоже на проблему в другом месте. Также done = true может быть лучше заменен break или return и т.д.

  • 0
    Хотя технически это не ответ, я бы тоже так поступил.
1

Оператор switch часто использует эквивалент хэш-кода /equals (по крайней мере для String и Enum) или таблицу перехода для другого случая, а ваш код:

done = ( type == INCREASING ? 
          currentVal >= duration ? true : false  // A
          : false) // B
    || ( type == DECREASING ? 
          currentVal <= 0 ? true : false  // C
       : false ) // D;

имеет ленивую оценку:

  • type == INCREASING => true, не выполнять D.
  • type == DECREASING => false, не выполнять C.
  • a || b a || b не выполнять b, если a истинно
  • a && b не выполняет b, если a является ложным

И вы должны написать так:

done = ( (type == INCREASING) ? currentVal >= duration : false) // B
    || ( (type == DECREASING) ? currentVal <= 0 : false ) // D;

А потом:

done = (type == INCREASING && currentVal >= duration)
    || (type == DECREASING && currentVal <= 0);

Я бы придерживался switch или простого if/else, если он становится более сложным, чем вышеприведенное выражение, а не использует отпечатки тройного оператора, который далек от чтения (я использовал новые строки, чтобы сделать его более читаемым в первом примере).

  • 0
    Я добавил круглые скобки, поскольку существует множество проблем с троичными без скобок; То же самое касается || / && (приоритет оператора и ассоциативность LTR / RTL - сука; не провоцируйте без необходимости)
  • 0
    Я удалил свои комментарии, так как я не мог редактировать первое, а второе было бы бесполезным без первого. Я не знаю, почему кто-то проголосовал за меня, но я надеюсь, что это не потому, что первое выражение в моем ответе не заключено в скобки между каждой частью, потому что это простая копия вопроса.
Показать ещё 2 комментария
1

Не должно быть существенного различия в скорости. Однако коммутатор гораздо читабельнее и удобен в обслуживании.

  • Легко читать и понимать
  • Добавление новой опции было бы намного проще в коммутаторе
  • Опция переключателя легче отлаживать.

См. Также Является ли тернарный оператор быстрее, чем условие "если"

  • 0
    Там не должно быть ничего, чтобы добавить к коммутатору Но спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню