Мне просто интересно, какая из них быстрее проверяет значения 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 может быть немного быстрее, потому что он не проверяет все? Мне нравится преимущество иметь его в одной строке, хотя так разница действительно стоит рассмотреть?
Третий вариант:
done = (type == INCREASING && currentVal >= duration) ||
(type == DECREASING && currentVal <= 0);
Я думаю, что это довольно хороший компромисс между кратностью и удобочитаемостью. Как отмечали другие, скорость довольно неуместна (в худшем случае вы выполняете четыре целочисленных сравнения и три логических сравнения), если только после того, как вы включили этот код в производственный процесс, вы увидите проблемы с производительностью и сможете определить, что узкое место здесь.
Это не "ответ"; но просто точка зрения, которая не в состоянии вставить комментарий.
Я бы, скорее всего, написал это так:
if (type == INCREASING && currentVal >= duration) {
done = true;
} else if (type == DECREASING && currentVal <= 0) {
done = true;
}
Нет else/done = false
, потому что если он очищен, это похоже на проблему в другом месте. Также done = true
может быть лучше заменен break
или return
и т.д.
Оператор 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
, если он становится более сложным, чем вышеприведенное выражение, а не использует отпечатки тройного оператора, который далек от чтения (я использовал новые строки, чтобы сделать его более читаемым в первом примере).
||
/ &&
(приоритет оператора и ассоциативность LTR / RTL - сука; не провоцируйте без необходимости)
Не должно быть существенного различия в скорости. Однако коммутатор гораздо читабельнее и удобен в обслуживании.
См. Также Является ли тернарный оператор быстрее, чем условие "если"