14

分岐予測に関するすばらしい投稿を読んでください。PHP言語を使用して再現しようとしていました。

<?php

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();

$count = 300000;
$sum = 0;
for ($i = 0; $i <= $count; $i++) {
    $array[] = rand(0, $count);
}

sort($array);

for ($i = 0; $i <= $count; $i++) {
    if ($array[$i] <= 150000) {
        $sum += $array[$i];
    }
}

$time_end = microtime_float();
$time = $time_end - $time_start;

echo $sum . '<br />';
echo 'End:' . $time;
?>

しかし、並べ替えを使用しても使用しなくても、常に同じ結果が得られます。多分私は何か間違ったことをしていますか?それとも、php には分岐予測子の最適化が組み込まれているのでしょうか?

更新:

コメントに従ってコードを変更し、ローカル マシンで時間を測定しました。

ソートされていない配列: 1.108197927475

ソートされた配列: 1.6477839946747

: 0.539586067.

この差がソートに費やされたと思います。分岐予測子が速度に影響を与えないのは本当のようです。

4

1 に答える 1

14

これを PHP で複製することはありません。話の終わり。その理由は、Java RTS が JiT コンパイル技術を使用して、Java 中間コードを基になる X86 オーダー コードにコンパイルするためです。この基礎となる注文コードは、これらの分岐予測アーティファクトを公開します。

PHP ランタイム システムは、解釈される疑似マシン コードであるバイトコードに PHP をコンパイルします。このインタープリターは、典型的なシングル コアで毎秒 0.5M オペコードのオーダーを実行します。つまり、各 PHP オペコードはおそらく 2 ~ 6K のネイティブ命令を使用します。これでは、分岐の微妙な点が失われます。

于 2012-07-02T17:44:05.677 に答える