1

一部の関数の実行時間を調べていましたが、マイクロタイムが間違っていることがわかりました。microtime()

実装№1microtime()は常に、ある関数をテストし、あるケースが別のケースよりも速いことがわかったときに、最初は常に2回目の実行よりも多くなっていますが、場所を置き換えた後( 2番目の関数を1番目の場所に)、とにかく遅くなりました。 3倍速…

function dotimes($times,$eval,$data=false) {for(;--$times;) eval($eval);}


$start = microtime(true);

dotimes(1000,'$i = $i?$times/2:1;');

printf(": executed : %f\n",microtime(true)-$start);

$start = microtime(true);

dotimes(1000,'$i = $i?$times/2:1;');

printf(": executed : %f\n",microtime(true)-$start);

// 1st case is always slower...

実装№2 ivはmicrotime()静的データストレージとして前に時々作成されましたが、その場合、実行時間は常に2回目は最初よりも遅くなります(実装№1の反対

function get_execution_time()
{
    static $microtime_start = null;

        return $microtime_start === null ? $microtime_start = microtime(true) : microtime(true) - $microtime_start;

}


function dotimes($times,$eval,$data=false) {for(;--$times;) eval($eval);}

get_execution_time();
dotimes(1000,'$i = $i?$times/2:1;');

printf(": executed : %f\n<br>",get_execution_time());
get_execution_time();
dotimes(1000,'$i = $i?$times/2:1;');
printf(": executed : %f\n<br>",get_execution_time());
//now 2nd case is faster..
  • 何が起こっているのか誰か教えてもらえますか?なぜこれらのマイクロタイムが1つのケースで常に遅くなり、静的ストレージを介して2番目の実行が遅くなるのか、なぜですか?

psここに小さなmt関数が必要な場合は、私の修正済みで正しく機能しています:

function get_mt() {static $mt; return $mt ? microtime(true)-$mt.$mt=null : $mt=microtime(true);}

添付 :

function get_mt() {static $mt; return $mt?microtime(true)-$mt:$mt=microtime(true);}

function dotimes($times,$eval,$data=false) {for(;--$times;) eval($eval);}

$start = microtime(true);
get_mt();
dotimes(10000,'$i = $i?$times/2:1;');
printf(":clean executed : %f\n<br>",microtime(true)-$start);
printf(":static executed : %f\n<br>",get_mt());
$start = microtime(true);
get_mt();
dotimes(10000,'$i = $i?$times/2:1;');
printf(":clean executed : %f\n<br>",microtime(true)-$start);
printf(":static executed : %f\n<br>",get_mt());
4

2 に答える 2

2

これまでのところ、実装№1が正しいことがわかりました。2 番目の実装で何を試したかわかりません。

ここでのアドバイス - 同じスクリプトで 2 つのケースをテストしないでください。それらを別々に数回実行してから、平均時間を見つけます。PHP は必要なときにメモリを割り当てますが、これは処理が遅くなります。2 番目のケースでは、既に割り当てられているメモリを再利用してこの操作をスキップし、間違った結果が得られる可能性があります。

于 2012-07-28T15:13:11.573 に答える
0

staticは、関数名に対してその関数内で変数をセミグローバルにします。

静的変数の前の値について静的配列をチェックする必要があるという事実に、遅延が生じていると言えます。

余分な作業==遅延

于 2012-07-28T14:50:08.713 に答える