2008-08-29 4 views
5

У меня есть условие if с двумя условиями (разделенное оператором OR), одно из условий охватывает + 70% ситуаций и занимает намного меньше времени для обработки/выполнения, чем второе условие, поэтому в интересы скорости. Я хочу, чтобы второе условие обрабатывалось, если первое условие оценивается как false.если оптимизация условия оператора

Если я заказываю условия, чтобы первое условие (более быстрое) появилось в первом случае, если в первом случае - в тех случаях, когда это условие выполняется и оценивает значение true, второе условие даже обрабатывается?

if ((condition1) | (condition2)){ 
    // do this 
} 

или мне нужно было бы вложить два оператора if, чтобы проверить только второе условие, если первое оценивается как false?

if (condition1){ 
    // do this 
}else if (condition2){ 
    // do this 
} 

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

ответ

9

Для булевых выражений C, C++, C#, Java и других .NET оптимизированы так, что, как только достаточно известно, ничего не оценивается.

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

a || b(); 

, если «а» верно, «б()» никогда не будет оценены, поэтому мы можем переписать его в:

if(!a) 
    b(); 

и точно так же:

a && b(); 

станет

if(a) 
    b(); 

Обратите внимание, что что это действительное только для || и & & оператора. Два оператора | и & побитовое или, и, соответственно, и поэтому не «оптимизировано».

EDIT: Как уже упоминалось, попытки оптимизировать код с использованием короткого замыкания очень редко проводят время.

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

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

0

Поскольку это помеченный язык агностик, я буду звонить. Для Perl, по крайней мере, первого варианта достаточно, я не знаком с PHP. Он оценивает слева направо и выпадает, как только условие выполняется.

3

Практически каждый язык делает оценку короткого замыкания. Значение второго условия оценивается только в том случае, если это необходимо. Чтобы это работало, большинство языков используют двойной канал, ||, а не единственный, |.

См http://en.wikipedia.org/wiki/Short-circuit_evaluation

0

В большинстве языков с достойной оптимизацией бывшего будет работать нормально.

2

В последнее время я видел много таких вопросов - оптимизацию до n-й степени.

Я думаю, что это имеет смысл при определенных обстоятельствах:

  1. Вычислительный условие 2 не является постоянной работы время
  2. Вы спрашиваете строго для образовательных целей - Вы хотите знать, как работает язык в не для сохранения 3us.

В других случаях, беспокоясь о «самом быстром» способе повторить или проверить условное, это глупо. Вместо того, чтобы писать тесты, требующие миллионов проб, чтобы увидеть любую записываемую (но незначительную) разницу, сосредоточьтесь на ясности.

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

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

2

Согласно this article PHP делает оценку короткого замыкания, а это означает, что если первое условие выполнено, то второе не оценивается даже. Это довольно легко проверить также (из статьи):

<?php 
/* ch06ex07 – shows no output because of short circuit evaluation */ 

if (true || $intVal = 5) // short circuits after true 
{ 

echo $intVal; // will be empty because the assignment never took place 
} 

?> 
3

В C, C++ и Java, заявление:

 
if (condition1 | condition2) { 
    ... 
} 

will evaluate both conditions every time and only be true if the entire expression is true.

The statement:


if (condition1 || condition2) { 
    ... 
} 

condition2 будет оценивать только если condition1 ложно. Разница существенна, если условие2 является функцией или другим выражением с побочным эффектом.

Существует, однако, разница между корпусом || и корпусом if/else.

0

| является побитовым оператором в PHP. Это не значит $a OR $b, точно. Вы захотите использовать двойную трубу. И да, как уже упоминалось, PHP делает оценку короткого замыкания. Аналогичным образом, если первое условие предложения && оценивается как false, PHP также не оценивает остальную часть предложения.

1

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

if(pObj != NULL && *pObj == "username") { 
    // Do something... 
} 

Здесь, короткое замыкание в настоящее время полагаться на то, что обеспечить pObj был выделен до разыменования его. Это гораздо более кратким, чем вложенные операторы if.

0

VB.net имеет два замечательных выражение под названием «OrElse» и «AndAlso»

OrElse будет короткое замыкание сам первый раз достигает Истинную оценку и выполнить код, который вы хотите.

If FirstName = "Luke" OrElse FirstName = "Darth" Then 
    Console.Writeline "Greetings Exalted One!" 
End If 

AndAlso будет короткое замыкание сам по себе в первый раз это ложная оценка и не оценивать код внутри блока.

If FirstName = "Luke" AndAlso LastName = "Skywalker" Then 
    Console.Writeline "You are the one and only." 
End If 

Я нахожу оба эти полезные.

+1

Это именно то, что || и && делают на большинстве других языков, соответственно. – 2010-06-12 09:49:18

2

Короткое замыкание не для оптимизации. Основная цель - избежать вызова кода, который не будет работать, но в результате будет доступен читаемый тест. Пример:

if (i < array.size() && array[i]==foo) ... 

Обратите внимание, что массив [я] очень хорошо может получить нарушение прав доступа, если я вне диапазона и сбою программы. Таким образом, эта программа, безусловно, зависит от короткого замыкания оценки!

Я считаю, что это причина написания выражений таким образом гораздо чаще, чем оптимизация.

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