ฉันรวมโปรแกรมทดสอบที่ใช้แต่ละวิธี 100,000 ครั้งครึ่งหนึ่งบนไฟล์ที่มีอยู่และอีกครึ่งหนึ่งในไฟล์ที่ไม่ได้
#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);
}
ผลลัพธ์สำหรับเวลาทั้งหมดในการเรียกใช้ 100,000 การโทรโดยเฉลี่ยมากกว่า 5 ครั้ง
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()
ฟังก์ชั่นที่ให้ประสิทธิภาพที่ดีที่สุดในระบบของฉัน (ลินุกซ์คอมไพล์ด้วยg++
) ที่มีมาตรฐานfopen
การโทรเป็นทางออกที่ดีที่สุดของคุณถ้าคุณสำหรับบางคนปฏิเสธเหตุผลที่จะใช้ฟังก์ชั่น POSIX
boost::filesystem
stat()
ดูเหมือนว่าจะใช้ (สมมติจากเอกสาร) ฉันไม่คิดว่าคุณจะทำได้เร็วกว่านี้สำหรับการโทร FS วิธีสร้างสิ่งที่คุณกำลังทำอย่างรวดเร็วคือ "หลีกเลี่ยงการดูไฟล์หลายพันไฟล์"