1

異なる 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

2つ目の結果は

0.50447297096252
0.48595094680786
0.49943733215332

3つ目の結果は

0.5283739566803
0.55247902870178
0.55091571807861


結果は問題ないように見えますが、問題は、このコードを実行するたびに結果が異なることです。また、同じコードを同じマシンで 3 回比較しています。

比較すると速度に違いがあるのはなぜですか?実行時間を比較して実際の違いを確認する方法はありますか?

4

4 に答える 4

1

比較中に速度に違いがあるのはなぜですか?

これには2つの理由があります。どちらも、PHPとオペレーティングシステムによって制御できないものがどのように処理されるかに関係しています。

第一に、コンピュータプロセッサは常に特定の量の操作しか実行できません。オペレーティングシステムは基本的に、これらの利用可能なサイクルをアプリケーションに分割するためのマルチタスクを処理する責任があります。これらのサイクルは一定の速度で与えられないため、プロセッササイクルの割り当て方法により、同一のPHPコマンドを使用しても速度の変動はわずかであると予想されます。

第二に、時間変動の大きな原因は、PHPのバックグラウンド操作です。メモリの割り当て、ガベージコレクション、変数のさまざまな名前空間の処理など、ユーザーには完全に隠されていることがたくさんあります。これらの操作にもコンピューターサイクルが必要であり、スクリプト中の予期しないときに実行される可能性があります。ガベージコレクションが最初のインクリメントで実行され、2番目のインクリメントでは実行されない場合、最初の操作に2番目の操作よりも時間がかかります。ガベージコレクションが原因で、テストが実行される順序も実行時間に影響を与える場合があります。

関係のない要因(バックグラウンドで実行されている他のアプリケーションなど)がテストの結果を歪める可能性があるため、速度テストは少し注意が必要です。一般に、スクリプト間でわずかな速度の違いを区別するのは困難ですが、速度テストを十分な回数実行すると、実際の結果を確認できます。たとえば、あるスクリプトが別のスクリプトよりも常に高速である場合、通常、そのスクリプトは処理速度の点でより効率的であると指摘されます。

于 2011-03-24T12:55:32.253 に答える
1

結果が異なる理由は、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");
于 2011-03-24T12:46:59.947 に答える
1

観測誤差というものがあります。
あなたの数がそれを超えない限り、あなたのすべての測定はただ時間の無駄です。

測定を行う唯一の適切な方法はプロファイリングと呼ばれ、意味のない部分ではなく、コードの重要な部分を測定することを意味します。

于 2011-03-24T12:50:49.210 に答える
-1

コンピューティング速度が 100% 決まっているわけではありません。PHP はサーバー側のスクリプトであるため、サーバーが利用できる計算能力に応じて、さまざまな時間がかかる場合があります。

各ステップで開始時間から差し引いているため、ロード時間 3 は 2 よりも大きく、1 よりも大きくなることが予想されます。

于 2011-03-24T12:33:01.037 に答える