프로그래밍 언어/C++

표준 C ++ / C ++ 11 / C를 사용하여 파일이 존재하는지 확인하는 가장 빠른 방법

Rateye 2021. 6. 10. 12:28
728x90
반응형
질문 : 표준 C ++ / C ++ 11 / C를 사용하여 파일이 존재하는지 확인하는 가장 빠른 방법은 무엇입니까?

표준 C ++ 11, C ++ 또는 C에 파일이 있는지 확인하는 가장 빠른 방법을 찾고 싶습니다. 수천 개의 파일이 있고 파일에 대해 작업을 수행하기 전에 모든 파일이 있는지 확인해야합니다. 다음 함수에서 /* SOMETHING */ 대신 무엇을 쓸 수 있습니까?

inline bool exist(const std::string& name) {     /* SOMETHING */ } 
답변

글쎄요, 저는 이러한 방법을 각각 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); 
}

5 회 실행에 걸쳐 평균 100,000 개의 호출을 실행하는 총 시간에 대한 결과,

Method Time
exists_test0 (ifstream) 0.485s
exists_test1 (FILE fopen) 0.302s
exists_test2 (posix access()) 0.202s
exists_test3 (posix stat()) 0.134s

stat() 함수는 내 시스템 (Linux, g++ 컴파일 됨)에서 최고의 성능을 제공했으며, 어떤 이유로 POSIX 함수 사용을 거부 할 경우 fopen

출처 : https://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c
728x90
반응형