ঠিক আছে, আমি একসাথে একটি পরীক্ষা প্রোগ্রাম নিক্ষেপ করেছি যা এই পদ্ধতিগুলির প্রত্যেকটি ১০,০০,০০০ বার দৌড়েছিল, অর্ধেক ফাইল রয়েছে যা বিদ্যমান ছিল এবং অর্ধেক ফাইলগুলিতে নেই।
#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);
}
মোট সময়ের জন্য ১০,০০,০০০ কল চালুর জন্য ফলাফল পাঁচ রানেরও বেশি,
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()
। (ডকুমেন্টেশন থেকে ধরে নেওয়া।) আমি মনে করি না আপনি এফএস কলগুলির জন্য খুব বেশি দ্রুত করতে পারবেন। আপনি কী করছেন তা দ্রুত করার উপায় হ'ল "হাজার হাজার ফাইলের দিকে তাকানো এড়ানো"।