我们以Hello, World! 程序为例,对比一下各个界面库的代码效率。对于界面程序,个人认为空间效率较之时间效率要占据主导因素,故此这里比较的是空间效率。另外,由于优化的极限是直接用Windows SDK,故此对比亦加入Windows SDK作为参考。参与此次对比的有:
- WINX
- WTL
- MFC
- SmartWin
- Windows SDK
功能:Hello, World!
界面:模态对话框
编译器:Visual C++ 2005
源代码:
- Windows SDK
hello.cpp - WINX
hello.cpp - WTL
hello.cpp - SmartWin
hello.cpp - MFC
HelloMfcDlg.cpp
HelloMfcDlg.h
HelloMfc.cpp
HelloMfc.h
比较结果:
首先,我们对比一下静态链接多线程模式的C库——即MultiThread(MT)时的情形。MFC亦以静态链接方式链接。由于所有的代码均静态链接进去,这种方式无疑是最公平的。对比结果如下:
- Windows SDK:48.0 K Reference:kernel32.dll, user32.dll
- WINX:52.0 K Reference:kernel32.dll, user32.dll
- WTL:76.0 K Reference:kernel32.dll, user32.dll, advapi32.dll, ole32.dll, oleaut32.dll
- SmartWin:132.0 K Reference:kernel32.dll, user32.dll, comctl32.dll
- MFC:184.0 K Reference:kernel32.dll, user32.dll, advapi32.dll, gdi32.dll, oleaut32.dll, shlwapi.dll, winspool.drv
可以看出,WINX产生的代码效率最高,并非常接近Windows SDK,而WTL则次之。SmartWin虽然以模板构建,但是比之MFC并无太大的优势。
我们再来比较一下动态链接多线程模式的C库——即MultiThread DLL(MD)时的情形。MFC采用动态链接方式。这是大型程序典型的链接方式,因此这个比较结果也颇有意义。
- Windows SDK:6.0 K Reference:kernel32.dll, user32.dll, msvc80.dll
- WINX:7.0 K Reference:kernel32.dll, user32.dll, msvc80.dll
- WTL:28.5 K Reference:kernel32.dll, user32.dll, msvc80.dll, advapi32.dll, ole32.dll, oleaut32.dll
- SmartWin:由于SmartWin编译的lib中没有MultiThread DLL(MD)模式,这里未针对其进行比较。
- MFC:10.5 K Reference:kernel32.dll, user32.dll, msvc80.dll, mfc80.dll
尽管MFC采用动态链接mfc80.dll的方式,但是它生成的代码仍然不及WINX短小。