Пожалуйста, рассмотрите следующий код:
$start = microtime();
for($i = 2; $i < 100; $i++)
{
for($y = 2; $y <= sqrt($i); $y++)
{
if($i%$y != 0)
{
continue;
}
else
{
continue 2;
}
}
echo $i.',';
}
echo "\nFinished in " . (microtime() - $start);
Учитывая, что в приведенном выше коде эффективно используется продолжение 2, чтобы разорвать внутренний цикл и пропустить любой код после внутреннего цикла, почему следующий код в среднем выполняется быстреекогда кажется, что он делает больше:
$start = microtime();
for($i = 2; $i < 100; $i++)
{
$flag = true;
for($y = 2; $y <= sqrt($i); $y++)
{
if($i%$y != 0)
{
continue;
}
else
{
$flag = false;
break;
}
}
if($flag === true) echo $i.',';
}
echo "\nFinished in " . (microtime() - $start);
Спасибо за любой ввод.
__ _ __ Обновление __ _ __ _ __ _ __ _
Спасибодля обратной связи, но мы, кажется, упустили момент.Независимо от того, является ли это хорошей практикой программирования, я пытался понять, почему разница в производительности (которая крошечная, но непротиворечивая) не находится в пределах смещения, которого я ожидал.
Передача истинного значения в микровремя кажется незначительной, поскольку оба образцаизмерено с использованием одного и того же метода с одинаковыми накладными расходами и одинаковой погрешностью.
Было протестировано более одного прогона, что подразумевается при использовании слова среднее.
Только для иллюстрации рассмотрите следующие небольшиеобразцы, использующие microtime (true), который показывает ту же схему, что и microtime ().
Я знаю, что это небольшая выборка, но картина довольно четкая:
Продолжить 0.00037288665771484 0.00048208236694336 0.00046110153198242 0.00039386749267575 0.000366210931039 *
Перерыв 0.00033903121948242 0.00035715103149414 0.00033307075500488 0.00034403800964355 0.00032901763916016
Спасибо за внимание и за любые дальнейшие отзывы.
** ___ ОБНОВЛЕНИЕ Дальнейшее расследование __ _ __ _ __ _ ___
Интересно, еслиоператоры echo удаляются из кода, оператор continue выполняет быстрее, а операторы echo на месте: break быстрее.
Пожалуйста, рассмотрите следующий пример кода и учтите, что результаты конфликтуют в зависимости от того, используются ли операторы echoудалены или нет:
<?php
$breakStats = array();
$continueStats = array();
ob_start();
for($i = 0; $i < 10000; $i++)
{
$breakStats[] = doBreakTest();
$continueStats[] = doContinueTest();
}
ob_clean();
echo "<br/>Continue Mean " . (array_sum($continueStats) / count($continueStats));
echo "<br/>Break Mean " . (array_sum($breakStats) / count($breakStats));
function doBreakTest()
{
$start = microtime(true);
for($i = 2; $i < 100; $i++)
{
$flag = true;
$root = sqrt($i);
for($y = 2; $y <= $root; $y++)
{
if($i%$y != 0)
{
continue;
}
else
{
$flag = false;
break;
}
}
}
if($flag === true) echo $i . '';
return microtime(true) - $start;
}
function doContinueTest()
{
$start = microtime(true);
for($i = 2; $i < 100; $i++)
{
$root = sqrt($i);
for($y = 2; $y <= $root; $y++)
{
if($i%$y != 0)
{
continue;
}
else
{
echo $i . '';
continue 2;
}
}
}
return microtime(true) - $start;
}
Присутствуют эхо-операторы:
Продолжить Среднее 0,00014134283065796 Среднее значение прерывания 0,00012669243812561
Отсутствует эхо-оператор:
Продолжить Среднее 0,00011746988296509Среднее значение перерыва 0.00013022310733795
Обратите внимание, что, удаляя оператор echo из теста break и flag, мы также удаляем проверку ($ flag === true), поэтому нагрузка должна уменьшиться, но продолжение в этом случае все равно выигрывает.W
Таким образом, в чистом сценарии продолжения n и разрыва + флага выясняется, что продолжение n является более быстрым конструктом.Но добавьте равное количество идентичных операторов echo и флагов производительности continue n.
Логично, что continue n должен быть быстрее, но я ожидал бы увидеть то же самое с присутствующими операторами echo.
Это явно разница в сгенерированных кодах операций, и положение оператора echo (внутренний цикл против внешнего цикла) кто-нибудь знает способ увидеть сгенерированные коды операций?Полагаю, это в конечном итоге то, что мне нужно, так как я пытаюсь понять, что происходит внутри.
Спасибо:)