QMacros速度简单评测

【测试说明】

本测试只是对QMacros的性能做一个简单的评价,从而给出一定的建议。受限于测试用例的设计无法覆盖各种情况,这些建议未必一定可靠,需要您自己进行一定的进一步测试。

【测试用例】

本次测试主要对比的是系统自带的StringReplace和QDAC中QString提供的StringReplaceW。从理论上来说,QMacros更复杂,适用范围也更广一些,两个StringReplace函数很明显更适用于少量匹配模式时使用。如果需要匹配和替换的模式比较多,前两者将由于需要重复的全文扫描而造成性能上与QMacros有严重的差距。这在后面的结果中我们也可以看到这一点。

第一个测试用例:是将20个 “%Year%” 构成的字符串分别替换为 2014 这个值。

第二个测试用例:是将20个 “%Now%” 构成的字符串分别替换为当前时间。

第三个测试用例:是将20个 “%Year% %Month% %Now%” 构成的字符串替换掉。

第四个测试用例:是将 “%Macro1%” ~ “%Macro20”  拼接成的字符串中的 “%Macro1%” ~ “%Macro20”  全部替换成2014。

第五个测试用例:还是上面的字符串,分别以%和不设定分隔符的方式,使用QMacros来进行简单替换对比,从而为大家做一下有和没有分隔符时带来的影响。当然,如果是一次编译,多次替换的情况下,两者之间的由于编译过程引用的性能差距,我个人认为还是可以忽略不计的。

上面的5个测试用例都是执行10万次,来统计时间。

【测试结果】

QQ截图20141212203501

首先看前4个用例的测试结果对比:

QQ截图20141212200233

 

转换成柱状图来看:

QMacroCompare

 

然后第5种测试用例的对比结果:

QQ截图20141212200341

 

【结果分析】

1、用例1由于%Year%是一个mvImmutable类型的值,所以QMacros实际上检测到无论执行多少次替换,结果不会有任何变化,所以直接缓存了第一次的替换结果,后面的99999次替换都直接返回了缓存的值,而不是象StringReplace和StringReplaceW一样,傻傻的实际替换10万次。所以在执行10万次效率远超过另外两者。

2、用例2由于%Now%是一个mvStable类型的值,所以实际上QMacros也会执行10万次实际的替换并每次替换时,调用函数获取Now这个宏的值,因此,其开销要比第一种情况大的多。速度也显然就会有所下降。但由于相应的优化,比系统自带的StringReplace仍要高效的多,对比QString的StringReplaceW,则明显处于下风。

3、用例3由于引入了3个需要替换的宏,所以,StringReplace和StringReplaceW都需要执行三次替换操作,以完成替换所有的宏。StringReplace在此性能已经不堪入目了,StringReplaceW和QMacros之间的性能差距在缩小。

4、用例4由于引入了20个需要替换的宏,所以StringReplace和StringReplaceW都需要执行20次替换操作,以完成替换所有的宏。StringReplace的性能差距进一步被拉大,StringReplaceW也已经被QMacros远远的甩在了后面。

5、用例5中,由于无分隔符时,要判定每个字符起始位置是否是分隔符的方式要比有分隔符的方式复杂的多,由此引入了额外的开销,所以造成性能上的差距。

【结论】

可能大家注意到了,用例4比用例3 QMacros 用的时间更少,这是由于相应的函数实现的不同引起的。用例4直接返回了2014这个值,而用例3需要格式化当前时间返回。

综合上面的测试结果,我们可以看到,随着需要替换的内容的复杂,QMacros带来的性能优势越来越明显。如果只是一两个宏的直接替换,用QString提供的StringReplaceW将是不二的选择,但如果从易于理解和代码统一的角度,QMacros显示是模板替换的不二选择。

分享到: