Это всегда трудно дать только «лучше» (лучше в каком отношении - строки кода, читаемость, скорость выполнения, количество байтов инструкций машинного кода ...?), но так как вы спрашиваете о скорости выполнения в этом случае, мы можем сосредоточиться на этом ,
Вы можете ввести эту переменную, которую вы предлагаете, и использовать ее, чтобы уменьшить условия до простого состояния, отличного от того, как только будет известен ответ. Меньше, чем условия тривиально переводят на две команды машинного кода на большинстве архитектур (например, CMP
(ср.), А затем JL
(прыжок, если меньше) или JNL
(скачок, если не меньше) на Intel IA-32). С небольшой удачей компилятор заметит (или вы можете сделать это самостоятельно, но я предпочитаю ясность, которая приходит с одинаковым рисунком повсюду), что trues < 2
будет всегда быть истинным в первых двух операциях if()
и оптимизировать его ,
int trues = 0;
if (trues < 2 && condition1) trues++;
if (trues < 2 && condition2) trues++;
if (trues < 2 && condition3) trues++;
// ...
if (trues >= 2)
{
// do something
}
Это после того, как ответ известен, уменьшает возможности комплексной оценки conditionN
к простой менее чем сравнение, из-за булево короткое замыкание поведения большинства языков.
Другой возможный вариант, если ваш язык позволяет использовать логическое условие для целого числа, заключается в том, чтобы использовать его для уменьшения количества строк исходного кода. Однако вы все равно будете оценивать каждое условие.
if((int)(condition1)
+ (int)(condition2)
+ (int)(condition3)
>= 2)
{
// do something
}
Это работает на основе предположения, что лить логическое ЛОЖЬ значения в целом приводит к 0, и литью ИСТИНЫ результаты в 1. Вы можете также использовать условный оператор для того же эффект, хотя следует помнить, что ему может ввести дополнительное разветвление.
if(((condition1) ? 1 : 0)
+ ((condition2) ? 1 : 0)
+ ((condition3) ? 1 : 0)
>= 2)
{
// do something
}
В зависимости от того, как смарт-optimzer компилятора, оно может быть в состоянии определить, что когда любые два условия оценены для истинного состояния всего всегда будет оценивать истинно, и оптимизировать его основе.
- Обратите внимание, что , если вы не на самом деле профилированный код и определил, что это преступник, это, вероятно, случай преждевременной оптимизации. Всегда стремиться к тому, чтобы код, который должен был быть прочитан человеческими программистами вначале, и быстрый, чтобы выполнить компьютер вторым, если вы не можете показать окончательное доказательство того, что в частности фрагмент кода, который вы смотрите, является актуальным узким местом производительности. Узнайте, как этот профилировщик работает и положит его в хорошее использование. Имейте в виду, что в большинстве случаев время программиста намного дороже, чем время процессора, а умные методы занимают больше времени, чтобы программист по обслуживанию выполнял синтаксический анализ.
- Кроме того, составители - действительно умные части программного обеспечения; иногда они на самом деле обнаруживают намерение написанного кода и могут использовать конкретные конструкции, предназначенные для ускорения этих операций, но полагающиеся на то, что они могут определить, что вы пытаетесь сделать. Прекрасным примером этого является замена двух переменных с использованием промежуточной переменной, которая на IA-32 может быть выполнена с использованием
XCHG
, исключая промежуточную переменную, но компилятор должен иметь возможность определить, что вы на самом деле делаете это, а не something clever which may give another result in some cases.
- Поскольку подавляющее большинство написанных неявно-отложенных программ тратит большую часть своей жизни в режиме обслуживания (и много написанного программного обеспечения, написанное живым и хорошо прошлогоднее его намерение лучше всего до даты), имеет смысл оптимизируйте для ремонтопригодности, если это не принесет неприемлемых затрат в других отношениях. Конечно, если вы оцениваете эти условия на триллион раз в жесткой петле, целевая оптимизация очень хорошо может иметь смысл. Но профилировщик точно скажет вам, какие части вашего кода нужно тщательно изучать с точки зрения производительности, а это означает, что вы избегаете излишнего усложнения кода.
И вышеперечисленные предостережения говорят, что я работал над кодом, который в последнее время вносит изменения, которые на первый взгляд почти наверняка будут считаться преждевременной оптимизацией деталей. Если у вас есть требование высокой производительности и использование профилировщика для определения того, какие части кода являются узкими местами, то оптимизация не является преждевременной. (Тем не менее, они могут быть недобросовестными в зависимости от конкретных обстоятельств.)
Итак, мы уверены, что это C, а не, например. Java, C++, C# или какой-либо другой C-подобный язык, который на самом деле не C? –
@ MichaelKjörling: да, OP прокомментировал ответ PHP. – geoffspear
@Wooble А, я вижу это сейчас. Итак, продолжайте движение. :) –