Какая конструкция "если" быстрее-оператор или тернарный оператор?
есть два типа if операторы в java-classic:if {} else {} и стенография: exp ? value1 : value2. Один быстрее другого или они одинаковы?
о себе:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
тернарный оператор:
int x = (expression) ? 1 : 2;
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