Vâng, tôi đã cùng nhau tạo ra một chương trình thử nghiệm chạy từng phương thức này 100.000 lần, một nửa cho các tệp tồn tại và một nửa trên các tệp không.
#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);
}
Kết quả cho tổng thời gian để chạy 100.000 cuộc gọi trung bình trên 5 lần chạy,
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**
Các stat()
chức năng cung cấp hiệu suất tốt nhất trên hệ thống của tôi (Linux, biên soạn với g++
), với một tiêu chuẩn fopen
gọi là đặt cược tốt nhất của bạn nếu bạn vì một lý do từ chối sử dụng các chức năng POSIX.
boost::filesystem
dường như sử dụngstat()
. (Giả sử từ tài liệu.) Tôi không nghĩ bạn có thể thực hiện nhanh hơn nhiều cho các cuộc gọi FS. Cách để thực hiện những gì bạn đang làm nhanh là "tránh xem hàng ngàn tệp."