36

使用:

for($i=1; $i<= 10000; ++$i) {
    $arrayOfNumbers[] = rand(1, 99999);
}

このような速度の違いがある理由を説明できる人もいます:

array_map(array($maxHeap, 'insert'), $arrayOfNumbers);
# Avg Time: 0.92856907844543s

# against

foreach($arrayOfNumbers as $number) {
    $maxHeap->insert($number);
}
# Avg Time: 1.3148670101166

$maxHeapオブジェクトであることclass MaxHeap extends SplMaxHeap

4

2 に答える 2

14

私の知る限り、Sajith Ammaの答えとは対照的に、phpは非同期的に何もしません。

これは実際には のルックアップの違いによるものだと思います$maxHeap->insert

現在のスコープ内で呼び出しているループを使用すると、php インタープリターはインスタンスforeachを検索してから検索する必要があります。実行しているスクリプトのスコープ内には、ルックアップを遅くする可能性のある他の変数が存在する可能性があります。$maxHeap->insertmaxHeapinsertmaxHeap

array_mapPHP インタープリターは、まったく同じ$maxHeap->insert.

于 2013-04-09T08:34:13.647 に答える
2

これは、コールバック関数と通常の関数の違いによるものです。

2番目の例では、foreachを使用した配列の反復で、各反復は「挿入」関数を呼び出し、実行(関数戻り制御)を待ってから次の反復に進みます。

ただし、array_map関数では、「挿入」はコールバック関数として発生し、「挿入」を呼び出し、結果を待たずに、配列内の次の項目で挿入を呼び出します。だからそれは速いです。

それが役に立てば幸い。

于 2011-12-16T15:50:12.313 に答える