PHPのファイルの存在を調べるメソッドのスピードを測定した。

PHPで「ファイルの存在を確認してから処理をする」ということがしたくなりました。でも、ファイルの存在確認って何か時間がかかるようなイメージがあります。そこで、簡単に測定してみました。

今回測定するメソッド

is_readable : ファイルが存在し、読み込み可能であるかどうかを知る
file_exists : ファイルまたはディレクトリが存在するかどうか調べる
is_file : 通常ファイルかどうかを調べる

測定コード

カウンタをループさせながら、10,000回のメソッド呼び出しを行います。以下のように、事前に10,000個のファイルを生成しておいて、存在する場合としない場合の比較も行いました。

実行マシンはMacBook Air(1.7 GHz Intel Core i5)、PHPのバージョンは5.3.10です。

<?php
echo 'is_readable (exists): ';
BenchTimer::start();
for ($i = 0; $i < 10000; $i++)
	is_readable("./exist/file_{$i}.txt");
echo BenchTimer::stop() . "sec\n";
 
echo 'is_readable (NOT exist): ';
BenchTimer::start();
for ($i = 0; $i < 10000; $i++)
	is_readable("./not_exist/file_{$i}.txt");
echo BenchTimer::stop() . "sec\n";
 
echo 'file_exists (exists): ';
BenchTimer::start();
for ($i = 0; $i < 10000; $i++)
	file_exists("./exist/file_{$i}.txt");
echo BenchTimer::stop() . "sec\n";
 
echo 'file_exists (NOT exist): ';
BenchTimer::start();
for ($i = 0; $i < 10000; $i++)
	file_exists("./not_exist/file_{$i}.txt");
echo BenchTimer::stop() . "sec\n";
 
echo 'is_file (exists): ';
BenchTimer::start();
for ($i = 0; $i < 10000; $i++)
	is_file("./exist/file_{$i}.txt");
echo BenchTimer::stop() . "sec\n";
 
echo 'is_file (NOT exist): ';
BenchTimer::start();
for ($i = 0; $i < 10000; $i++)
	is_file("./not_exist/file_{$i}.txt");
echo BenchTimer::stop() . "sec\n";

BenchTimerクラスは、ただmicrotime()の差を求めているだけのクラスです。

結果、is_readableが速かった。ただし差は小さい。

以下が結果です。

is_readable (exists): 0.040242910385132sec
is_readable (NOT exist): 0.033736944198608sec
file_exists (exists): 0.042173147201538sec
file_exists (NOT exist): 0.034549951553345sec
is_file (exists): 0.054291009902954sec
is_file (NOT exist): 0.038280963897705sec

結果としては、is_readableが早くて、is_fileが遅いという結果になりました。とはいえ差は小さく、is_readableとfile_existsの差はないといってもいいレベルです。なお、どのメソッドについても、「存在するファイルの判定」より「存在しないファイルの判定」の方が高速でした。

そして、1ファイルあたり、4usということで、思っていたより遥かに早かったです。

PHPのマニュアルには、この3つのメソッドについて「結果はキャッシュされる」と記述されています。したがって、存在判定を厳密に行う場合は、キャッシュクリアした上で実行する必要があり、もっと遅くなると思います。

さくらVPS 512MBでも試してみた。

MacBook Airが速いのかなと思い、さくらVPSの最下位プランでも試してみました。

is_readable (exists): 0.021505117416382sec
is_readable (NOT exist): 0.014915943145752sec
file_exists (exists): 0.020488977432251sec
file_exists (NOT exist): 0.015106916427612sec
is_file (exists): 0.023898124694824sec
is_file (NOT exist): 0.014140844345093sec

結果としてはこちらの方が更に速く、1ファイルあたり2usのスケールでした。

存在の判定がシビアだったり対象ファイルが膨大でなければ、速度については全く気にせずに使えるメソッドでした。

About katty0324

Leave a Reply

Scroll To Top