Yah saya mengumpulkan program pengujian yang menjalankan masing-masing metode ini 100.000 kali, setengah pada file yang ada dan setengah pada file yang tidak.
#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);
}
Hasil untuk total waktu untuk menjalankan 100.000 panggilan dengan rata-rata lebih dari 5 kali,
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**
The stat()
fungsi yang disediakan kinerja terbaik pada sistem saya (Linux, yang disusun dengan g++
), dengan standar fopen
panggilan menjadi taruhan terbaik Anda jika Anda untuk beberapa alasan menolak untuk menggunakan fungsi POSIX.
boost::filesystem
tampaknya digunakanstat()
. (Dengan asumsi dari dokumentasi.) Saya tidak berpikir Anda bisa melakukan lebih cepat untuk panggilan FS. Cara untuk mempercepat apa yang Anda lakukan adalah "hindari melihat ribuan file."