2013-06-21 4 views
0

Очевидно, что эти два образца достигают того же. Но есть ли какие-либо, возможно, конкретные случаи реализации, где можно добиться лучшей производительности, чем другие?если заявление с отрицанием или без него

Возможно, глупый вопрос, но это заставило меня думать сегодня.

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

if (something == 'something') { 
    return "something's up"; 
} 
return; 

против

if (something != 'something') { 
    return; 
} 
return "something's up"; 
+5

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

+2

Как насчет 'if (something) {}' и 'if (! Something) {}'? – thefourtheye

+0

Я не знаю, ты скажи мне @thefourtheye. – finishingmove

ответ

5

One может не выполнить другую очень немного, если вы ожидаете, как это произойдет в среднем, и как ваш конкретный процессор обрабатывает branch prediction. Например, если вы знаете, что ваш процессор всегда будет предсказать, что отрасль приведет в если заявление, и вы ожидаете, что-то сравняться правда чаще, чем нет, то первый выбор:

if (something == true) { 
    return true; 
} 
return; 

будет превосходя второй. Прогнозы ветвления процессора редко бывают такими простыми и теперь адаптивны (http://en.wikipedia.org/wiki/Branch_predictor см. «Насыщающий счетчик»), но, надеюсь, это дает вам немного понимания. В любом случае увеличение производительности крайне незначительно, особенно на сегодняшних системах.

: Сложение:

Что касается двух в комментариях: Когда он достигнет процессора в сборе они будут точно так же, как и то, что у вас есть выше, так что на самом деле ничего не меняется.

+0

Это тот ответ, на который я надеялся. Если кто-то лучше разбирается в таких вопросах, я бы хотел это услышать. – finishingmove

+0

Прочитайте мое сообщение о компиляторах и ассемблере ..., которые, вероятно, доставят вас туда, где вам нужно. –

+0

Хорошая точка @ om-nom-nom, но я соглашусь с этим. Это дало мне хорошее представление о том, где искать. – finishingmove

2

В любом случае это нормально, с точки зрения производительности они почти наверняка идентичны и любая разница будет незначительной. Но для ясности, рекомендуется, чтобы писать условия, как это:

if (something) { // no need to compare something == true 
    return true; 
} 
return false; 

Или еще лучше:

return something; // just return the boolean value! 

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

+0

Это не обязательно логическое, проверьте мои изменения. – finishingmove

0

Код читается и изменяется намного чаще, чем написано. Поскольку производительность при переводе на язык ассемблера одинакова, если инструкции должны быть написаны так, что это проще всего читать.

Пример:

if (x > (2 + 3)) //or something more complex 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

легче читать таким образом:

bool isGreaterThanFive = x < (2 + 3) 

if (isGreaterThanFive) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

и еще более компактной:

if (isGreaterThanFive) return true; //Very close to human language 
else return false; 

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

EDIT: больше о читаемости кода, Совершенный код Стив Макконнелл http://en.wikipedia.org/wiki/Code_Complete

+0

Спасибо, но это не по теме ... И я хорошо знаю, что вы говорите. – finishingmove

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