Сравнение времени выполнения в PHP - PullRequest
1 голос
/ 24 марта 2011

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

<?php
    $load_time_1 = 0;
    $load_time_2 = 0;
    $load_time_3 = 0;

    for($x = 1;  $x <= 20000; $x++)
    {
        //code 1
        $start_time = microtime(true);

        $i = 1;
        $i++;

        $load_time_1 += (microtime(true) - $start_time);

        //code 2
        $start_time = microtime(true);

        $i = 1;
        $i++;

        $load_time_2 += (microtime(true) - $start_time);

        //code 3
        $start_time = microtime(true);

        $i = 1;
        $i++;

        $load_time_3 += (microtime(true) - $start_time);
    }

    echo $load_time_1;
    echo '<br />';
    echo $load_time_2;
    echo '<br />';
    echo $load_time_3;
?>


Я выполнил сценарий несколько раз.

Первый результат

0.44057559967041
0.43392467498779
0.43600964546204

Второй результат

0.50447297096252
0.48595094680786
0.49943733215332

Третий результат

0.5283739566803
0.55247902870178
0.55091571807861


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

Почему при сравнении будет разница в скорости? И есть ли способ сравнить время выполнения и увидеть реальную разницу?

Ответы [ 4 ]

1 голос
/ 24 марта 2011

Почему при сравнении будет разница в скорости?

Для этого есть две причины, которые связаны с тем, как вещи, которые находятся вне вашего контроля, обрабатываютсяPHP и операционная система.

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

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

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

1 голос
/ 24 марта 2011

причина, по которой результаты различаются, заключается в том, что в то же время происходят другие вещи, такие как задачи на базе Windows или Linux, другие процессы, вы никогда не получите точного результата, вам лучше всего выполнить код за 100 итерацийа затем разделите результат, чтобы найти среднее время и используйте его в качестве фигуры /

Также было бы полезно для вас создать класс, который сможет справиться с этим для вас, таким образом, вы можете использовать все этовремя без необходимости писать код каждый раз:

попробуйте что-то вроде этого (не проверено):

class CodeBench
{
    private $benches = array();

    public function __construct(){}

    public function begin($name)
    {
        if(!isset($this->benches[$name]))
        {
            $this->benches[$name] = array();
        }

        $this->benches[$name]['start'] = array(
            'microtime' => microtime(true)
            /* Other information*/
        );
    }

    public function end($name)
    {
        if(!isset($this->benches[$name]))
        {
            throw new Exception("You must first declare a benchmark for " . $name);
        }

        $this->benches[$name]['end'] = array(
            'microtime' => microtime()
            /* Other information*/
        );
    }

    public function calculate($name)
    {
        if(!isset($this->benches[$name]))
        {
            throw new Exception("You must first declare a benchmark for " . $name);
        }

        if(!isset($this->benches[$name]['end']))
        {
            throw new Exception("You must first call an end call for " . $name);
        }

        return ($this->benches[$name]['end'] - $this->benches[$name]['start']) . 'ms'
    }
}

А затем используйте так:

$CB = new CodeBench();

$CB->start("bench_1");

    //Do work:

$CB->end("bench_1");

$CB->start("bench_2");

    //Do work:

$CB->end("bench_2");

echo "First benchmark had taken: " . $CB->calculate("bench_1");
echo "Second benchmark had taken: " . $CB->calculate("bench_2");
1 голос
/ 24 марта 2011

есть вещь, называемая Ошибка наблюдения .
Пока ваши цифры не превышают ее, все ваши измерения - просто трата времени.

Единственный правильный способ выполнения измерений называется профилирование и предназначен для измерения значительных частей кода, а не бессмысленных.

0 голосов
/ 24 марта 2011

Скорость вычислений никогда не устанавливается на 100% в камне. PHP является сценарием на стороне сервера, поэтому, в зависимости от вычислительной мощности, доступной для сервера, это может занять разное время.

Поскольку вы вычитаете время начала каждого шага, ожидается, что время загрузки 3 будет больше 2, что будет больше 1.

...