Эта тема на forum.dklab.ru


RGoblin: Скорость выполнения разных вариантов if-elseif-else
какой из этих скриптов теоретически будет выполняться быстрее? Скорость одиночного запроса - слишком неточна будет, а вот несколько сотен одновременно самое оно...

1й вариант:

$var = 'test';
if (($var == 'test') || ($var == 'vest') || ($var == 'quest'))
{
$text = $var;
}



2й вариант:

if ($var == 'test')
{
$text = $var;
}
elseif ($var == 'vest')
{
$text = $var;
}
elseif ($var == 'quest')
{
$text = $var;
}


Если я ничего не путаю, то второй вариант будет быстрее, поскольку производится только одна проверка, в отличие от первого варианта, где производятся все три проверки...
Или разницы нет? (для сотен одновременных запросов это очень важно)
Юрий Насретдинов:
Быстрее всего будет выполняться вот этот вариант:


$var='test';
$v=array('test','west','quest');
if(in_array($var,$v)) $test=$var;

chin:
Быстрее всего будет выполняться вот этот вариант:
$var='test';
$v=array('test','west','quest');
if(in_array($var,$v)) $test=$var;
Я бы не сказал, но спорить не хочу. Обьясните систему работы, если не сложно? Помоему, поиск по массиву происходит все по тому-же принцыпу..

А на счет двух приведенных вариантов могу поспорить...
Вот пример:
if(false || true || true)
{
// do something
}
Код сработает таким образом:
Сначала проверяет первое условие, если ложно проверяет слежующее, если ложно, проверяет далее, до тех пор, пока не найдет правдивое. В данном случае условие выполнится дойдя до второго оператора, даже не проверяя третий. Это теория работы логического оператора || (или).

P.S.
Все что я описал выше - исключительно из моего практического опыта (я ни где об этом не читал). По этому могу ошибаться, но на сей счет я ставлю очень маленький процент.
Maus:
RGoblin
Я бы сказал, что в обоих Ваших вариантах будет одинаковое число проверок...
Дмитрий Котеров:
"Преждевременная оптимизация - корень всех зол"
(С) кто-то из великих

"Не стоит беспокоиться о быстродействии программы, пока оно само о себе не заявит"
(С) кто-то другой из великих
Дмитрий Котеров:
"Не стоит экономить на спичках"
(С), кажется, тоже кого-то, но приписывают почему-то мне, хотя я точно у кого-то подслушал в свое время
chin:
Просто когда больше нечем заняться, хочется копнуть глубже. Ну а кто-то не может больше заниматься ни чем другим, кроме как красиво "раскладывать спички". ИМХО тут все зависит от задачи. Лично мне, когда сроки не поджымают, нравится таким заниматься (:
RGoblin:
Спасибо всем. :)

А это особенность пхп, что
Сначала проверяет первое условие, если ложно проверяет слежующее, если ложно, проверяет далее, до тех пор, пока не найдет правдивое. В данном случае условие выполнится дойдя до второго оператора, даже не проверяя третий. Это теория работы логического оператора || (или).

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


З.Ы. Кстати, это у меня глюк или в моих постах ббтеги не форматируются?
Maus:
неизвестно, что там после первого "или" идет - может "и"...
А для таких случаев как раз и расставляют группирующие скобки. Потому как помнить для каждого языка приоритет операций (где-то в мане была табличка, поищите) столь подробно - глупое дело.

//оффтоп: Вероятно, Вы отключили BBcode
Дмитрий Котеров:
Вроде в других языках при этом "или" проверялись Все условия, и потом уж если хоть один выполнялся, то засчитывался общий true...
Ничего подобного. Только в Паскале была опция "complete boolean evaluation", да и то она по умолчанию выключена. В большинстве других языков (С/С++, Java, Perl, PHP, C# и т.д.) - проверка условий сокращенная, причем - часто с оптимизацией.
chin:
Вроде в других языках при этом "или" проверялись Все условия, и потом уж если хоть один выполнялся, то засчитывался общий true...
Ну уж не знаю про другие языки... По крайней мере, в PHP работает все именно так и никак по другому. И я думаю, что это самый разумный логический подход.
Ведь на самом же деле неизвестно, что там после первого "или" идет - может "и"... Если только не учитывать вложенность...
чушь...
if($hz1 || $hz2 || $hz3 && $hz4)
{
// do something
}
"Если $hz1 или $hz2 или ( $hz3 И $hz4 )" - восприниматься будет так.

То же самое, только грамотнее
if($hz1 || $hz2 || ($hz3 && $hz4) )
{
// do something
}
Дмитрий Котеров:

function f() { echo "f"; return true; }
function g() { echo "g"; return false; }
if (f() || g()) echo "!";

Что выводит?
eDeth:
Некто DlMA однажды поделился неплохим кодом для оценки производительности кода. Оригинала нет, но могу поделиться чуть заточенной "под себя" версией.
Сейчас попробую прицепить...
А использовать так:

define('PERF_TEST', true);
include "pt_log.php";
pt_s('my project');
include "pt_print.php";

... тут поехал работать основной код ...

pt_s('my func');
... а тут ф-ция, нас интересующая особо, желательно выполнить много раз
pt_e('my func');


pt_e('my project');
pt_print();
RGoblin:
Что выводит?
ээ... вроде "f!" а к чему это?

eDeth
поразмышляю :) псиб.
Дмитрий Котеров:
ээ... вроде "f!" а к чему это?
К тому, что если левая часть OR-выражения истинна, то вторая даже и не вычисляется (не вызывается функция g()), потому что результат по любому будет истиной. О чем и речь шла.
RGoblin:
Сатори... :)
хорошие, блин, источники информации были (названий уже не помню), которые утверждали что при ИЛИ все равно проверяются все условия...
Dmitri R. S.:
все условия
Такое есть при |, но | - не логический, а числовой оператор (двоичное ИЛИ).

Эта тема на forum.dklab.ru