अच्छी तरह से मैं एक परीक्षण कार्यक्रम है कि इन तरीकों में से प्रत्येक को 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 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()
। (प्रलेखन से मान लें।) मुझे नहीं लगता कि आप एफएस कॉल के लिए बहुत तेजी से कर सकते हैं। आप जो कर रहे हैं, उसे बनाने का तरीका है "हजारों फ़ाइलों को देखने से बचें।"