PHPのfwriteとfile_put_contentsのパフォーマンス比較テスト

まず、結論を出しましょう。PHPプログラムは多くのログレコードを保持しません。一般的に、PHPプログラムは例外を検出し、ファイルログを出力してから、終了します。この場合、どのように選択すればよいですか?実際、straceの結果から明らかなように、fwriteとfile_put_contentsシステムコールの結果は同じであり、file_put_contents呼び出しは単純であり、関数変数の転送を節約できるphp呼び出しです。したがって、一般的に、file_put_contentsを使用することをお勧めします。

1.パフォーマンステスト

ほとんどの記事と同様に、パフォーマンス方法から始めます。

<?php
$start_time = microtime(true);
$fp = fopen("fwrite.txt","w");
for ($i = 1;$i <= 1000000;++$i) {
    fwrite($fp, "{$i}\r\n");
}
fclose($fp);
$end_time = microtime(true);
echo "fwrite cost:",($end_time-$start_time),"\r\n";
 
$start_time = microtime(true);
for ($i = 1;$i <= 1000000;++$i) {
file_put_contents("file_put_contents.txt","{$i}\r\n",FILE_APPEND);
}
$end_time = microtime(true);
echo "file_put_contents cost:",($end_time-$start_time),"\r\n";

結果出力:

fwriteコスト:46.916671991348file_put_contents
コスト:437.18376493454

fopenとfwriteをループに入れます。

<?php
$start_time = microtime(true);

for ($i = 1;$i <= 1000000;++$i) {
    $fp = fopen("fwrite.txt","w");
    fwrite($fp, "{$i}\r\n");
    fclose($fp);
}

$end_time = microtime(true);
echo "fwrite cost:",($end_time-$start_time),"\r\n";
 
$start_time = microtime(true);
for ($i = 1;$i <= 1000000;++$i) {
file_put_contents("file_put_contents.txt","{$i}\r\n",FILE_APPEND);
}
$end_time = microtime(true);
echo "file_put_contents cost:",($end_time-$start_time),"\r\n";

結果出力:

fwriteコスト:851.75481009483

file_put_contentsコスト:451.74156188965

fwriteとfile_put_contentsのパフォーマンスの違いは、fopenとfcloseの位置に最も反映されていることがわかります。

 

2、strace分析

straceを使用して、fwriteが高速である理由を分析しましょう。PHPスクリプトを変更するだけです。forループの$ i条件が2以下に変更されます。これは、2回実行されることを意味します。

<?php
$start_time = microtime(true);
$fp = fopen("fwrite.txt","w");
for ($i = 1;$i <= 2; ++$i) {
    fwrite($fp, "{$i}\r\n");
}
fclose($fp);
$end_time = microtime(true);
echo "fwrite cost:",($end_time-$start_time),"\r\n";
 
$start_time = microtime(true);
for ($i = 1;$i <= 2; ++$i) {
file_put_contents("file_put_contents.txt","{$i}\r\n",FILE_APPEND);
}
$end_time = microtime(true);
echo "file_put_contents cost:",($end_time-$start_time),"\r\n";

実行:strace php test.php(テストファイル名がtestであると想定)

出力:

……。

open( "/ home / lizhibin / php_fwrite_test / fwrite.txt"、O_WRONLY | O_CREAT | O_TRUNC、0666)= 3
fstat(3、{st_mode = S_IFREG | 0664、st_size = 0、...})= 0
lseek(3 、0、SEEK_CUR)= 0
write(3、 "1 \ r \ n"、3)= 3
write(3、 "2 \ r \ n"、3)= 3
close(3)= 0
write(1、 " fwrite cost: "、12fwrite cost :) = 12
write(1、" 0.0008699893951416 "、180.0008699893951416)= 18
write(1、" \ r \ n "、2
)= 2
getcwd(" / home / lizhibin / php_fwrite_test "、4096 )= 31
lstat( "/ home / lizhibin / php_fwrite_test / file_put_contents.txt"、0x7fff415c5c40)= -1 ENOENT(そのようなファイルまたはディレクトリはありません)
open( "/ home / lizhibin / php_fwrite_test / file_put_contents.txt"、O_WRONLY | O_CREAT | O_APPEND、0666)= 3
fstat(3、{st_mode = S_IFREG | 0664、st_size = 0、...})= 0
lseek(3 、0、SEEK_CUR)= 0
lseek(3、0、SEEK_CUR)= 0
write(3、 "1 \ r \ n"、3)= 3
close(3)= 0
getcwd( "/ home / lizhibin / php_fwrite_test"、 4096)= 31
lstat( "/ home / lizhibin / php_fwrite_test / file_put_contents.txt"、{st_mode = S_IFREG | 0664、st_size = 3、...})= 0
open( "/ home / lizhibin / php_fwrite_test / file_put_contents.txt "、O_WRONLY | O_CREAT | O_APPEND、0666)= 3
fstat(3、{st_mode = S_IFREG | 0664、st_size = 3、...})= 0
lseek(3、0、SEEK_CUR)= 0
lseek(3、0、SEEK_CUR)= 0
write(3、 "2 \ r \ n"、3)= 3
close(3)= 0

……。

file_put_contentsを使用して赤でマークされたステートメントは、書き込み時に最初にファイルを開き、書き込み後にファイルを閉じることに注意してください。ただし、fwriteでは、ファイルを1回開くだけでよいため、fwriteブロックを使用するのは当然のことです。

 

おすすめ

転載: blog.csdn.net/JineD/article/details/111083872
おすすめ