Bu yöntemlerin her birini 100.000 kez, yarısı var olan dosyalar ve yarısı olmayan dosyalar üzerinde çalıştıran bir test programı bir araya getirdim.
#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 üzerinden ortalama 100.000 çağrıyı yürütmek için gereken toplam sürenin sonuçları,
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()
Fonksiyon sistemimde (ile derlenmiş Linux, en iyi performansı sağladı g++
standart ile) fopen
nedense çöpler için POSIX fonksiyonları kullanmak durumunda çağrı en iyi bahis olmak.
boost::filesystem
gibi görünüyorstat()
. (Belgelerden yola çıkarak.) FS çağrıları için çok daha hızlı yapabileceğinizi sanmıyorum. Hızlı yaptığınız şeyi yapmanın yolu "binlerce dosyaya bakmaktan kaçınmaktır".