Ich habe ein Testprogramm erstellt, das jede dieser Methoden 100.000 Mal ausgeführt hat, zur Hälfte mit Dateien, die es gab, und zur Hälfte mit Dateien, die es nicht gab.
#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);
}
Ergebnisse für die Gesamtzeit zur Ausführung der 100.000 Aufrufe, gemittelt über 5 Läufe,
Methode
Zeit
exists_test0
(ifstream)
0.485s
exists_test1
(DATEI fopen)
0.302s
exists_test2
(posix access())
0.202s
exists_test3
(posix stat())
0.134s
En stat()
Funktion lieferte die beste Leistung auf meinem System (Linux, kompiliert mit g++
), mit einem Standard fopen
Aufruf ist die beste Lösung, wenn Sie sich aus irgendeinem Grund weigern, POSIX-Funktionen zu verwenden.