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

Я склонен к "if-условному синдрому", что означает, что я стараюсь использовать все условия постоянно. Я редко пользуюсь тройным оператором. Например:

//I like to do this:
int a;
if (i == 0)
{
    a = 10;
}
else
{
    a = 5;
}

//When I could do this:
int a = (i == 0) ? 10:5;

Имеет ли значение, что я использую? Что быстрее? Есть ли заметные отличия в производительности? Лучше ли использовать кратчайший код, когда это возможно?

Я использую язык программирования Java.

Ответ 1

Имеет ли значение, что я использую?

Да! Второй - более читаемый. Вы торгуете одной строкой, которая вкратце выражает то, что вы хотите, против девяти линий эффективного беспорядка.

Что быстрее?

Ни.

Лучше ли использовать кратчайший код, когда это возможно?

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

Ответ 2

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

Сказав это, постарайтесь преодолеть свое отвращение к условному оператору - в то время как, конечно, это возможно для чрезмерного использования, оно может быть действительно полезно в некоторых случаях. В конкретном примере, который вы дали, я определенно использовал бы условный оператор.

Ответ 3

Пример троичного оператора:

int a = (i == 0) ? 10 : 5;

Вы не можете выполнить назначение с if/else следующим образом:

// invalid:
int a = if (i == 0) 10; else 5;

Это хорошая причина использовать тернарный оператор. Если у вас нет заданий:

(i == 0) ? foo () : bar ();

a if/else не намного больше кода:

if (i == 0) foo (); else bar ();

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

Вложенный в контекст, короткая форма иногда очень удобна:

System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ()); 

Ответ 4

Да, это важно, но не из-за производительности выполнения кода.

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

Джош Блох "Беспокойство о производительности" на Parleys.com

Ответ с цитированием 9 строк в сравнении с одним может ввести в заблуждение: меньше строк кода не всегда лучше. Тернарные операторы могут быть более сжатыми в ограниченных ситуациях (ваш пример хороший).

НО их часто можно злоупотреблять, чтобы сделать код нечитаемым (что является кардинальным грехом) = не вставлять тернарные операторы!

Также рассмотрим будущую ремонтопригодность, если-else гораздо проще расширить или изменить:

int a;
if ( i != 0 && k == 7 ){
    a = 10;
    logger.debug( "debug message here" );
}else
    a = 3;
    logger.debug( "other debug message here" );
}


int a = (i != 0 && k== 7 ) ? 10 : 3;  // density without logging nor ability to use breakpoints

p.s. очень полный ответ stackoverflow на К тернарному или не к тернарному?

Ответ 5

Тернарные операторы - это только сокращение. Они компилируются в эквивалентный оператор if-else, то есть они будут точно такими же.

Ответ 6

Кроме того, тернарный оператор допускает форму "необязательного" параметра. Java не позволяет добавлять необязательные параметры в сигнатуры методов, но тернарный оператор позволяет легко встраивать выбор по умолчанию, когда null предоставляется для значения параметра.

Например:

public void myMethod(int par1, String optionalPar2) {

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
            .trim()
            .toUpperCase(getDefaultLocale());
}

В приведенном выше примере передача null в качестве значения параметра String получает значение строки по умолчанию вместо NullPointerException. Это короткий и сладкий и, я бы сказал, очень читаемый. Более того, как уже отмечалось, на уровне байтового кода действительно нет разницы между тернарным оператором и if-then-else. Как и в приведенном выше примере, решение о выборе основывается полностью на удобочитаемости.

Кроме того, этот шаблон позволяет вам сделать параметр String по-настоящему необязательным (если это считается полезным для этого), перегружая метод следующим образом:

public void myMethod(int par1) {
    return myMethod(par1, null);
}

Ответ 7

В приведенном примере я предпочитаю тройной или оператор условия (?) по определенной причине: я ясно вижу, что назначение a не является необязательным. С простым примером, не слишком сложно сканировать блок if-else, чтобы увидеть, что a назначается в каждом разделе, но представьте себе несколько назначений в каждом разделе:

if (i == 0)
{
    a = 10;
    b = 6;
    c = 3;
}
else
{
    a = 5;
    b = 4;
    d = 1;
}

a = (i == 0) ? 10 : 5;
b = (i == 0) ? 6  : 4;
c = (i == 0) ? 3  : 9;
d = (i == 0) ? 12 : 1;

Я предпочитаю последнее, чтобы вы знали, что не упустили задание.

Ответ 8

Лучше всего использовать то, что лучше читает - практически во всех практических действиях 0 разница между производительностью.

В этом случае я думаю, что последнее утверждение читается лучше, чем первое утверждение if, но осторожно, чтобы не злоупотреблять тройным оператором - иногда это действительно может сделать вещи намного менее ясными.

Ответ 9

попробуйте использовать switch case statment. но обычно это не является предпочтительным узким местом.