大家对于Qt诟病比较多的地方就是性能,尤其在嵌入式或者比较低端的平台上。所以在Qt4.5中,第一条设计理念就是提升Qt的运行时性能,内部项 目代号称之为Falcon – 猎鹰,目的就是想让Qt飞起来。:-)
其实性能优化在Qt4.5中,算是最最重要,最核心的改进了。为什么放在最后再说,是因为其中所包含的改进是在是太多了,也非常具体,很难简单的概 括。但是,从另一方面来说,对于Qt应用程序的开发者,除非有兴趣潜心研究,着实不需要关心具体的实现细节,原有的Qt应用,只需要运行在新的4.5之 上,你就可以感觉到性能的提升,而不用修改原有程序代码。
深入一些,那么究竟有哪些改进以及性能方面的提升?主要分三部分来说,分别是Qt本身绘图引擎的优化,“热插拔”图形系统以及性能 Benchmark工具。
先来看看Qt本身绘图引擎的优化:
简而言之,在Qt4.5之前的版本中,Qt的Paint Engine在QPainter的操作过程中,有一些冗余的地方。在4.5中,这些细微,但是会影响全局性能的函数都被重新仔细分析和优化了,诸 如:QPainter::begin() / end(),save() / restore(), drawTextItem(),drawPixmap()。总体来说,对于一个实际的Widget控件绘图,提升将近50%的效率。下面这张图是一些 Widget在4.4和4.5的benchmark。
Developer Blog here
除了QPaint的改进之外,4.5的Backingstore中也有不少改进,包括去除了许多不必要的QRegion的操作,以及是更加智能的 Update操作。
下面的表格展示了含有透明以及不透明控件的Backingstore的不同Update操作性能比较。
Operation | Qt 4.4 | Qt 4.5 | Boost |
---|---|---|---|
Full update (transparent widgets) | 4330 ms | 2446 ms | 1.8x |
Full update (opaque widgets) | 3352 ms | 1464 ms | 2.3x |
Scroll (opaque widgets) | 50231 ms | 3746 ms | 13.4x |
Partial update (opaque widgets) | 4246 ms | 1567 ms | 2.7x |
Complex update (opaque widgets) | 4966 ms | 2265 ms | 2.2x |
Full update (opaque children) | 3376 ms | 1464 ms | 2.3x |
Move (opaque widgets) | 50293 ms | 4188 ms | 12.0x |
Mass update (opaque widgets) | 9560 ms | 1679 ms | 5.7x |
Developer Blog here
另外有比较大改进的地方还有Graphic View。在Graphic Item绘图之前,加入了很多对于exposed areas, StyleOption, intersecting shapes, clips的预判断,这样在真正绘图的时候,速度就会得到提升。最直观的例子就是,在Qt4.4中的4000芯片例子,在Windows平台上平均可以获 得30%的提升,而在Linux上,使用Qt内置的Raster引擎和Graphic View,相比于原有的X11,则可以得到5到100倍的性能提升。
Developer Blog here
还有一些其他细微的改进,以及非图形方面的改进,诸如在X11平台上的绘图引擎中使用<!-- [if !mso]> <mce:style><! v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} p/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v/:textbox {display:none;} --><!-- [if !ppt]--><!-- .O {color:black; font-size:149%;} a:link {color:#44A51C !important;} a:active {color:#AFD4F0 !important;} a:visited {color:#F9F206 !important;} --><!-- .sld {left:0px !important; width:6.0in !important; height:4.5in !important; font-size:103% !important;} --><!-- [endif]-->XSHM (MIT-SHM)来提升绘图效率,以及通过QIODevice类的优化,提升了File IO的性能,继而提高了FileDialog中对象的加载速度等等。