php ディレクトリの存在確認を行える「is_dir」と「file_exists」と「stream_resolve_include_path」のパフォーマンスを計測する

  • 作成日 2021.12.07
  • php
php ディレクトリの存在確認を行える「is_dir」と「file_exists」と「stream_resolve_include_path」のパフォーマンスを計測する

phpで、ディレクトリの存在確認を行える「is_dir」と「file_exists」と「stream_resolve_include_path」のパフォーマンスを計測するサンプルコードを記述してます。phpのバージョンは8.0です。

環境

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

実行時間計測

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

$startTime = microtime(true);

// 処理を記述

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

以下は、「is_dir」と「file_exists」と「stream_resolve_include_path」を使用して、ディレクトリの存在確認を行うコードを1000万回実行して、パフォーマンスを計測するサンプルコードとなります。

ディレクトリが存在する場合(ディレクトリhoge1は存在する)

<?php

// 1000万回実行
define('COUNT', 10000000);

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

for ($i = 0; $i < COUNT; ++$i) {
    is_dir('hoge1');
}

result($startTime, 'is_dir');

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

for ($i = 0; $i < COUNT; ++$i) {
    stream_resolve_include_path('hoge1');
}

result($startTime, 'stream_resolve_include_path');

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

for ($i = 0; $i < COUNT; ++$i) {
    file_exists('hoge1');
}

result($startTime, 'file_exists');

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

実行結果

[1回目] 
測定結果 : is_dir
process time: 2.95934 ミリ秒

測定結果 : stream_resolve_include_path
process time: 12.70412 ミリ秒

測定結果 : file_exists
process time: 12.96479 ミリ秒

[2回目] 
測定結果 : is_dir
process time: 3.47380 ミリ秒

測定結果 : stream_resolve_include_path
process time: 14.35333 ミリ秒

測定結果 : file_exists
process time: 14.26092 ミリ秒

[3回目] 
測定結果 : is_dir
process time: 3.95799 ミリ秒

測定結果 : stream_resolve_include_path
process time: 13.77610 ミリ秒

測定結果 : file_exists
process time: 13.99797 ミリ秒

ファイルが存在しない場合(ディレクトリhoge2は存在しない)

is_dir('hoge2');
stream_resolve_include_path('hoge2');
file_exists('hoge2');

実行結果

[1回目] 
測定結果 : is_dir
process time: 11.26930 ミリ秒

測定結果 : stream_resolve_include_path
process time: 71.00283 ミリ秒

測定結果 : file_exists
process time: 13.40706 ミリ秒

[2回目] 
測定結果 : is_dir
process time: 10.89593 ミリ秒

測定結果 : stream_resolve_include_path
process time: 69.48698 ミリ秒

測定結果 : file_exists
process time: 12.22266 ミリ秒

[3回目] 
測定結果 : is_dir
process time: 10.04512 ミリ秒

測定結果 : stream_resolve_include_path
process time: 71.96820 ミリ秒

測定結果 : file_exists
process time: 12.23065 ミリ秒

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