2016-06-16 11 views
3

私は好奇心を持っています。私は1ミルの単純な配列要素の配列を作成し、それらをループする単純なPHPスクリプトを作成しました。同じコードの2回目の実行時のPHP実行時間

最初の実行では、約1,4秒かかると思われます。 しかし、同じコードの2回目の実行では、常に約2,1秒かかります。私は同じ結果でこれを数回繰り返しました。

これはなぜですか?ここ

コードサンプル:

$timeStart = microtime(true); 

    $invoices = array(); 
    for ($i = 1; $i <= 1000000; $i++) { 
     $invoices[] = array(
      'issuedValue' => $i, 
      'fiscalNumber' => $i, 
      'random1' => $i, 
      'random2' => $i, 
      'random3' => $i, 
     ); 
    } 
    foreach ($invoices as $invoice) { 
     // nothing here 
    } 

    var_dump(microtime(true) - $timeStart); 

    // second iteration here 

    $timeStart = microtime(true); 

    $invoices = array(); 
    for ($i = 1; $i <= 1000000; $i++) { 
     $invoices[] = array(
      'issuedValue' => $i, 
      'fiscalNumber' => $i, 
      'random1' => $i, 
      'random2' => $i, 
      'random3' => $i, 
     ); 
    } 
    foreach ($invoices as $invoice) { 
     // nothing here 
    } 

    var_dump(microtime(true) - $timeStart); 
+0

どちらの場合でも「何か」と同じものがあると思いますか?私の見解は、そこにあるだろう... forループには何も明白でないので。また、同じテストを複数回実行して平均を取ってください...他の項目が速度に影響を与える可能性があります。 – Barry

+0

あなたのコードをループで実行して、結果を見てください。PHPを遅くするいくつかの追加のプロセスかもしれません。 – Justinas

答えて

3

それは理由も、ガベージコレクションのサイクルがセカンドラン時にトリガー確率が高くなり、メモリ使用量を発生します。実行中に次のコードを追加した場合:

unset($timeStart, $invoices, $i, $invoice); 
gc_collect_cycles(); 

参照を削除して未使用メモリをクリーンアップすると、同じ時間が得られます。

+0

繰り返しの回数を減らしてギャップを埋めるのですが、時はまだ違います。 – Progrock

+0

どのくらい違いますか?ほとんどの場合、私のマシンでは '' '1.2779951095581'''と ' '' 1.2829298973083'''とほぼ同じです。 –

+0

反復回数が少ないほど、実行中にプロセスがスケジューラに触れられなかった可能性が高くなります。 –

関連する問題