글쎄, 나는이 방법들 각각을 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);
}
총 10 번의 통화를 실행 한 총 시간에 대한 결과는 평균 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()
기능은 내 시스템 (Linux로 컴파일 된 g++
) 에서 최고의 성능을 제공했으며 fopen
어떤 이유로 POSIX 함수 사용을 거부하면 표준 호출이 가장 좋습니다.
boost::filesystem
사용하는 것 같습니다stat()
. (문서에서 가정) FS 호출에 대해 훨씬 빨리 할 수 있다고 생각하지 않습니다. 빠른 작업을 수행하는 방법은 "수천 개의 파일을 보지 마십시오."