本文主要对MFC和Boost在目录遍历方面的效率进行比较
MFC目录遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| void OperateDirs( const CString folder ) { CFileFind ff; CString strfolder=folder; strfolder+=_T("*.*"); BOOL es=ff.FindFile(strfolder); while(es) { es=ff.FindNextFile(); if (!ff.IsDirectory() && !ff.IsDots()) { m_num++; } if(ff.IsDirectory() && !ff.IsDots()) { CString str1=ff.GetFilePath(); str1+=_T("\\*.*"); OperateDirs(str1);
} } ff.Close(); }
m_num=0; CTime start=CTime::GetCurrentTime(); OperateDirs(_T("F:\\boost_1_55_0\\")); CTime end1=CTime::GetCurrentTime(); CTimeSpan elapse=end1-start; CString str=elapse.Format(_T("hours:%H,minutes:%M,Second,%S")); CString output; output.Format(_T("%s,totalfiles,%d"),str,m_num); MessageBox(output);
|
经过测试总共43634个文件,耗时2秒。
BOOST库目录遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <boost/filesystem.hpp> using namespace boost::filesystem;
CTime start=CTime::GetCurrentTime(); const TCHAR *folder=_T("F:\\boost_1_55_0\\"); m_num=0; recursive_directory_iterator end; for ( recursive_directory_iterator itr(folder); itr != end;++itr ) {
if (!is_directory(*itr)) { m_num++; }
} CTime end1=CTime::GetCurrentTime(); CTimeSpan elapse=end1-start; CString str=elapse.Format(_T("hours:%H,minutes:%M,Second,%S")); CString output; output.Format(_T("%s,totalfiles,%d"),str,m_num); MessageBox(output);
|
经过测试总共43634个文件,耗时54秒。
总结,MFC的windows API效率是BOOST的20多倍,可能是MFC专注于WINDOWS的原因,而BOOST为了跨平台,用了很多模板类,封装层次很高。