Bueno, elaboré un programa de prueba que ejecutaba cada uno de estos métodos 100,000 veces, la mitad en archivos que existían y la otra mitad en archivos que no existían.
#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);
}
Los resultados del tiempo total para ejecutar las 100,000 llamadas promediaron más de 5 ejecuciones,
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**
La stat()
función proporcionó el mejor rendimiento en mi sistema (Linux, compilado con g++
), siendo una fopen
llamada estándar su mejor opción si por alguna razón se niega a usar las funciones POSIX.
boost::filesystem
Parece que usastat()
. (Suponiendo de la documentación.) No creo que pueda hacer mucho más rápido para las llamadas FS. La forma de hacer lo que está haciendo rápido es "evitar mirar miles de archivos".