星期三, 十月 04, 2006

对比WINX,WTL,MFC,SmartWin代码效率

我们以Hello, World! 程序为例,对比一下各个界面库的代码效率。对于界面程序,个人认为空间效率较之时间效率要占据主导因素,故此这里比较的是空间效率。另外,由于优化的极限是直接用Windows SDK,故此对比亦加入Windows SDK作为参考。参与此次对比的有:

  • WINX
  • WTL
  • MFC
  • SmartWin
  • Windows SDK

功能:Hello, World!

界面:模态对话框

编译器:Visual C++ 2005

源代码:

比较结果:

首先,我们对比一下静态链接多线程模式的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短小。

6 条评论:

匿名 说...

首先,赞一个。许兄开发的这套GUI库确实有亮点。加油!
得空,小弟也愿效劳^_^。

下面补充运行时内存空间占用的对比:
工具:任务管理器
格式:库名 : 内存占用(k) + 虚拟内存占用(k) = 总值(k)

c运行库为动态库:
winx: 2,548 + 916 = 3464
sdk : 2,560 + 916 = 3476
wtl : 2,648 + 936 = 3584
mfc : 3,192 + 972 = 4164

c运行库为静态库:
sdk : 2,328 + 804 = 3132
winx: 2,332 + 804 = 3136
smartwin : 2,500 + 612 = 3112
wtl : 2,500 + 876 = 3376
mfc : 2,868 + 984 = 3852

注:
1,每次启动程序,内存占用都会有些波动,以上值是个人认为最有代表的值。
2,实际上本例中,winx和sdk开发的内存占用非常接近,几乎可以认为相同。
3, 以上对比简单的值比较,没有深究细节。


做为用户的感觉:
winx确实比wtl易用性和学习曲线好,但比smartwin之类的库还需提高。
或许,winx并不以易用易学为主要目标。

fenix

xushiwei 说...

谢谢你补充了这么详细的信息。也欢迎加入WINX的开发。WINX的第一目标是易用。因此如果其他任何库在易用性上有什么地方需要借鉴的,均可以考虑。由于我对SmartWin不是特别了解,因此也欢迎你就易用性方面谈谈WINX比之SmartWin不足的地方。

匿名 说...

http://sallyide.sourceforge.net/
smartwin可视化编辑器。smartwin有了它,易用性如虎添翼。
http://vaca.sourceforge.net/
许兄有空可以看看。

窗口行为是一个特色,是否可以借鉴参考状态机中行为继承的概念?
属性化编程是最能体现易学易用,也方便日后做可视化编辑器.
目前winx的属性化编程使用宏封装来实现,实现方式无所谓。只是建议能让用户看不到宏。确实有不少cpp用户怕用宏。^_^
winx考虑能兼容mfc,qt,wtl等用户的习惯及代码。很好。但这是双刃剑,好比cpp兼容c一样。也会带来副作用^_^。

对winx只是浮光掠影,难提出好建议。
不成熟的看法是:
1·文档,最好能补充原理性(core)的文档。
2·多移植引用wtl的控件库,考虑用户的实用化要求。一套GUI库不应当只是用来学习和简单使用的,多考虑商业化开发的实际需求。
3·Frame目前较弱,建议加强。
4·即便winx可以包容使用其他的开发框架,但还是建议有自己的开发框架体系。毕竟,不能要求用户都是高手。


会一直关注winx的。
fenix

xushiwei 说...

1、可视化是winx的方向。
2、文档是当前的重点。只是觉得blog的表现形式不太适合文档,所以就有了winxcn.com,目前该网站建设中。当然我仍然会在blog上写,但是相对会不成体系一些。
3、AOP、Frame、DragDrop(DataObject)、Automation、IPC等等,这些都是winx后续的内容。
4、宏是一把双刃剑。winx的消息机制避免了使用宏,这是一个进步。但是从目前来看,为了支持属性而不影响性能,宏的使用似乎避无可避。
5、其实,模板更是一把双刃剑。根据我的经验,很多工作了多年C++程序员仍然畏惧模板,这一点一度让我很吃惊。相对而言,尽管不少人(包括我)反对宏,但是没有几个不了解宏的。winx为了效率,不得已采用了模板。但是,我尽量把模板的特性压缩到最少,以便多数人都可以看懂它。

匿名 说...

功能少而多余的代码就少,代码大小应该少。

dujun 说...

在一个小项目中试用了winx,最令人惊讶的莫过于生成的代码尺寸,不过没有正版的VC60,最后还是用了SDK。希望winx将来能支持mingw。
先顶一下,现在小弟的C++水平还很菜,不然到是很想为winx做点力所能及的事情。