さて、これらのメソッドをそれぞれ10万回実行するテストプログラムをまとめました。半分は存在するファイルで、残りの半分は存在しないファイルで実行されました。
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>
inline bool exists_test0 (const std::string& name) {
ifstream f(name.c_str());
return f.good();
}
inline bool exists_test1 (const std::string& name) {
if (FILE *file = fopen(name.c_str(), "r")) {
fclose(file);
return true;
} else {
return false;
}
}
inline bool exists_test2 (const std::string& name) {
return ( access( name.c_str(), F_OK ) != -1 );
}
inline bool exists_test3 (const std::string& name) {
struct stat buffer;
return (stat (name.c_str(), &buffer) == 0);
}
5回の実行で平均した100,000回の呼び出しを実行する合計時間の結果、
Method exists_test0 (ifstream): **0.485s**
Method exists_test1 (FILE fopen): **0.302s**
Method exists_test2 (posix access()): **0.202s**
Method exists_test3 (posix stat()): **0.134s**
このstat()
関数は、私のシステム(Linux、でコンパイルg++
)で最高のパフォーマンスを提供しましたfopen
。何らかの理由でPOSIX関数の使用を拒否した場合は、標準の呼び出しが最善の策です。
boost::filesystem
使用しているようstat()
です。(ドキュメントから推測します。)FS呼び出しの方がはるかに速くできるとは思いません。作業を高速化する方法は、「何千ものファイルを見ないようにする」ことです。