3

適切に動作していないことが懸念されていたコードの一部について、簡単なベンチマークを作成しました。非常に奇妙な結果が得られました。このベンチマークを見てください:
ベンチマーク
テスト ファイル

ベンチマーク コードは次のとおりです。

$start = microtime(true)*1000;

//code
$log=file_get_contents('test.txt').'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'."\n";
file_put_contents('test.txt', $log, LOCK_EX);

$end=microtime(true)*1000;
$time = $end-$start;
echo 'Time : '.(int)$time.'ms<br />';


$start = microtime(true)*1000;

//code
$log='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'."\n";
file_put_contents('test.txt', $log, LOCK_EX|FILE_APPEND);

$end=microtime(true)*1000;
$time = $end-$start;
echo 'Time : '.(int)$time.'ms<br />';

私が気付いたのは、私の意見では高速であるべき追加オプションが実際には遅いということです。問題が私のベンチマークにある場合は、教えてください。
遅くなる理由を誰かに説明してもらえますか?

さらに、F5 キー (連続して更新) を押したままにすると、テキスト ファイルがクリアされることがわかりました (:O) なぜですか?

編集 Ilya Bursovが言ったように、ベンチマークを100回の反復で実行するように変更しました。追加操作は、読み取りと書き込みが本来あるべきように永遠にかかるのに対し、完了するのにごくわずかな時間がかかるようになりました。ただし、キャッシュをクリアしても、1 回の反復で奇妙な結果が生成されます。誤差の範囲でさえ、多くのことに影響される可能性があることは知っていますが、徹底的な回答をいただければ幸いです。

4

2 に答える 2

4

Phpfopenopenシステムコールを呼び出しO_TRUNCます。これは、非追加モードで書き込む前にファイルを切り捨てることを意味します。この切り捨てには時間がかかり、処理が遅くなります。

切り捨てが発生した後、実際のコンテンツが到着する前に、空のファイルが表示されます。

straceコマンドラインでこれを確認できます。

于 2013-10-29T14:06:34.100 に答える