MFC目录遍历与BOOST效率比较

本文主要对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()) //dots为.或..
{

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为了跨平台,用了很多模板类,封装层次很高。