php ファイルの内容を全て表示できる「file」と「file_get_contents」と「fgets」のパフォーマンスを計測する

php ファイルの内容を全て表示できる「file」と「file_get_contents」と「fgets」のパフォーマンスを計測する

phpで、ファイルの内容を全て表示できる「file」と「file_get_contents」と「fgets」のパフォーマンスを計測するサンプルコードを記述してます。phpのバージョンは8.0です。

環境

  • OS  CentOS Stream release 8
  • php 8.0.0
  • nginx 1.14.1

実行時間計測

microtimeを使用すれば、処理にかかった時間を計測することが可能です。

$startTime = microtime(true);

// 処理を記述

$time = microtime(true) - $startTime; // 処理にかかった時間(ミリ秒)

以下は、「file」と「file_get_contents」と「fgets」を使用して、hoge.txtに記述された全ての内容を取得するコード100万回実行して、パフォーマンスを計測するサンプルコードとなります。

<?php

// 100万回実行
define('COUNT', 1000000);

// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i) {
    $data1 = file("hoge.txt");
    foreach ($data1 as $key => $value) {
    }
}

result($startTime, 'file');

// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i) {
    $data2 = file_get_contents("hoge.txt");
}

result($startTime, 'file_get_contents');

// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i) {
    $fp = fopen("hoge.txt", 'r'); // rは読み込みモード

    while (!feof($fp)) {  //ファイルポインタがEOF(End Of File)にいるかを判定
        fgets($fp); // 1行ずつ読み込み
    }

    fclose($fp);
}

result($startTime, 'fgets');

function result($time, $str)
{
    echo '測定結果 : ' . $str . PHP_EOL;
    // 表示は少数第5桁まで
    echo "process time: " . number_format((microtime(true) - $time), 5) . ' ミリ秒' . PHP_EOL;
    echo PHP_EOL;
}

実行結果

[1回目] 
測定結果 : file
process time: 9.53313 ミリ秒

測定結果 : file_get_contents
process time: 8.93494 ミリ秒

測定結果 : fgets
process time: 10.85059 ミリ秒

[2回目] 
測定結果 : file
process time: 9.46048 ミリ秒

測定結果 : file_get_contents
process time: 8.88595 ミリ秒

測定結果 : fgets
process time: 10.88762 ミリ秒

[3回目] 
測定結果 : file
process time: 9.39323 ミリ秒

測定結果 : file_get_contents
process time: 8.85138 ミリ秒

測定結果 : fgets
process time: 10.81306 ミリ秒

実行した結果を見る限り、「file_get_contents」がパフォーマンスは良さそうです。