2015-08-01 2 views
-1

Использование условной/тройной оператор:Является ли условный оператор более эффективным, чем нормальный, если?

freeCache = (freeCache > (2880 * 3)) ? (2880 * 3) : freeCache; 

есть присвоение значения в каждом случае.

Используя это нормально, если-заявление:

if(this.freeCache > (2880 * 3)) this.freeCache = (2880 * 3) 

должен быть только присвоением значения, если значение freeCache слишком высоко.

Какой из них на самом деле более совершенен?

+2

Это не «inline if». –

+2

Я бы не стал беспокоиться о «производительности», но прежде всего о читаемости. Я сомневаюсь, что этот фрагмент кода может стать узким местом для вашего приложения. –

+0

Как вы думаете? – biziclop

ответ

2

Их нет даже эквивалент.

Тройное выражение может быть расширен следующим образом:

if(freeCache > (2880 * 3)) { 
    freeCache = 2880 * 3; 
} else { 
    freeCache = freeCache; 
} 

Если вы действительно обеспокоены производительностями, есть [п незначительна] производительность ударила в том, что вы выполняете избыточное задание снова.

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

+0

Сам вопрос указывает на эту неэквивалентность «в каждом случае есть назначение значений». vs "должно существовать только назначение значений, если значение freeCache слишком велико". –

+0

На данный момент я немного потерян. Если они знают, что троянец выполнит задание в каждом случае, * и * у них есть требование, чтобы он этого не делал, тогда нет оснований для обсуждения этого вопроса - тройной не удовлетворил бы их потребности. – Makoto

5

Просто для удовольствия я попытался скомпилировать две предложенные реализации (тройной оператор и явный оператор if). Они оба используют if_icmple инструкции, так что я предполагаю, что производительность будет идентична:

Версия if: «?»

public static void main(java.lang.String[]); 
Code: 
    0: iconst_0 
    1: istore_1 
    2: iload_1 
    3: sipush  8640 
    6: if_icmple  13 
    9: sipush  8640 
    12: istore_1 
    13: return 

Использование Тройной оператор:

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_0 
    1: istore_1 
    2: iload_1 
    3: sipush  8640 
    6: if_icmple  15 
    9: sipush  8640 
    12: goto   16 
    15: iload_1 
    16: istore_1 
    17: return 

Там есть небольшая неэффективность в использовании оператора ? (по крайней мере, в данном конкретном случае) в связи с пунктом : (инструкции меченых 15 и 16 в листинге выше). JVM, вероятно, оптимизирует эти избыточные операции.

Смежные вопросы