zhigu 发表于 2006-12-6 18:50:00

[转帖]脚本引擎速度评测—谁是最快的脚本引擎?lua么,让我来为大家揭晓

<strong><br/><br/></strong>呵呵,最近的空闲时间,我在对以前策划的脚本引擎架构的方案进行实施,编写完脚本引擎核心的原型系统。在互联网搜了搜最快的脚本引擎,在国内众口一词的都说Lua最快,其实是不然的。 <p></p><p>让我们用事实来说话吧:</p><p>下面的测试全部采用&nbsp;QueryPerformanceCounter&nbsp;高精度计数【Lua这个家伙不支持int64让我头疼了一阵,还好我想到了解决的方法】。</p><p>我这里测试指令:只简单测试加法运算;总共测试2017个加法指令与常数直接相加,最后的结果应该为:300*2017=605100</p><p>另外我还将测试子程序调用的速度。</p><p>没有比较是不行的,我用机器语言直接运行的效率和脚本相比:</p><p>下面是加法指令直接运行的速度:</p><p>x86汇编:<br/>&nbsp;&nbsp;;计时开始<br/>&nbsp;&nbsp;MOV&nbsp;EBX,&nbsp;300&nbsp;&nbsp;BB2C010000<br/>&nbsp;&nbsp;ADD&nbsp;EBX,&nbsp;300&nbsp;&nbsp;81C32C010000<br/>&nbsp;&nbsp;.....&nbsp;---&nbsp;总计&nbsp;2017&nbsp;次<br/>&nbsp;&nbsp;ADD&nbsp;EBX,&nbsp;300&nbsp;&nbsp;81C32C010000<br/>&nbsp;&nbsp;;计时结束<br/>&nbsp;<br/>结果运行时间:60</p><p>Lua&nbsp;Script&nbsp;脚本:<br/>&nbsp;&nbsp;(计时开始)<br/>&nbsp;&nbsp;local&nbsp;count&nbsp;=&nbsp;300<br/>&nbsp;&nbsp;count&nbsp;=&nbsp;count&nbsp;+&nbsp;300<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....&nbsp;(总计&nbsp;2017&nbsp;次)<br/>&nbsp;&nbsp;count&nbsp;=&nbsp;count&nbsp;+&nbsp;300<br/>&nbsp;&nbsp;(计时结束)</p><p>【Lua5.0.2】运行时间:110&nbsp;<br/>【Lua5.1&nbsp;】&nbsp;运行时间:&nbsp;120</p><p><br/>EUPHORIA&nbsp;加法指令顺序执行效率测试脚本:<br/>&nbsp;&nbsp;--计时开始<br/>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;300<br/>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=300<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....&nbsp;---&nbsp;总计&nbsp;2017&nbsp;次<br/>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=300<br/>&nbsp;&nbsp;--计时结束<br/>&nbsp;<br/>结果运行时间:74&nbsp;</p><p>我写的&nbsp;TurboScript&nbsp;脚本:<br/>&nbsp;&nbsp;(计时开始)<br/>&nbsp;&nbsp;300<br/>&nbsp;&nbsp;300&nbsp;+<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....&nbsp;(总计&nbsp;2017&nbsp;次)<br/>&nbsp;&nbsp;300&nbsp;+<br/>&nbsp;&nbsp;(计时结束)<br/>&nbsp;<br/>结果运行时间:87&nbsp;【比汇编慢0.31倍;&nbsp;如果当我进一步取消CPUStates(判断终止标志位)测试,运行时间居然和汇编差不多了:61!嘿嘿。】</p><p><br/>子过程调用的速度比较:</p><p>x86&nbsp;汇编&nbsp;子过程调用效率测试脚本:<br/>function&nbsp;add(a,b:&nbsp;integer):&nbsp;integer;<br/>asm<br/>&nbsp;&nbsp;mov&nbsp;EAX,&nbsp;a<br/>&nbsp;&nbsp;add&nbsp;EAX,&nbsp;b<br/>end;<br/>--计时开始<br/>&nbsp;&nbsp;asm<br/>&nbsp;&nbsp;&nbsp;&nbsp;mOV&nbsp;EAX,&nbsp;300<br/>&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EDX,&nbsp;300&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;ADD<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....&nbsp;(总计&nbsp;2017&nbsp;次)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EDX,&nbsp;300&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;ADD<br/>--计时结束<br/>结果运行时间:126</p><p>Lua&nbsp;Script&nbsp;脚本:<br/>function&nbsp;iAdd(a,&nbsp;b)<br/>&nbsp;&nbsp;return&nbsp;a+b<br/>end&nbsp;function<br/>&nbsp;&nbsp;(计时开始)<br/>&nbsp;&nbsp;local&nbsp;count&nbsp;=&nbsp;300<br/>&nbsp;&nbsp;count&nbsp;=&nbsp;iAdd(count,&nbsp;300)<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....&nbsp;(总计&nbsp;2017&nbsp;次)<br/>&nbsp;&nbsp;count&nbsp;=&nbsp;iAdd(count,&nbsp;300)<br/>&nbsp;&nbsp;(计时结束)</p><p>【Lua5.0.2】运行时间:1270&nbsp;<br/>【Lua5.1&nbsp;】&nbsp;&nbsp;运行时间:1820</p><p><br/>EUPHORIA&nbsp;子过程调用效率测试脚本:<br/>function&nbsp;iAdd(integer&nbsp;a,&nbsp;integer&nbsp;b)<br/>&nbsp;&nbsp;return&nbsp;a+b<br/>end&nbsp;function<br/>--计时开始<br/>count&nbsp;=&nbsp;300<br/>count&nbsp;=&nbsp;iAdd(count,&nbsp;300)<br/>.....&nbsp;---&nbsp;总计&nbsp;2017&nbsp;次<br/>count&nbsp;=&nbsp;iAdd(count,&nbsp;300)<br/>--计时结束<br/>&nbsp;<br/>结果运行时间:522&nbsp;【比汇编慢了近0.759倍,比TurboScript&nbsp;近调用慢近0.70倍】</p><p><br/>TurboScript&nbsp;子过程近调用效率测试<br/>:&nbsp;Add&nbsp;+;<br/>--计时开始<br/>300<br/>300&nbsp;Add<br/>.....&nbsp;(总计&nbsp;2017&nbsp;次)<br/>300&nbsp;Add<br/>--计时结束<br/>结果运行时间:157【只比汇编慢0.197倍,改用字节代码流后速度略有损失,现在是运行时间:169】</p><p>TurboScript&nbsp;子过程模块之间的VM&nbsp;DLL远调用效率<br/>:&nbsp;Add&nbsp;external&nbsp;'test';&nbsp;//该函数在另一文件中。<br/>--计时开始<br/>300<br/>300&nbsp;Add<br/>.....&nbsp;(总计&nbsp;2017&nbsp;次)<br/>300&nbsp;Add<br/>--计时结束</p><p>启用按需加载技术的结果运行时间:1082【不稳定徘徊在1082-8828】<br/>使用的是按需加载技术,也就是仅当该函数被调用的时候才加载,然后加上Cache技术,后面的调用就在内存中处理。<br/>时间远远长于其它,是因为加载文件耗去了绝大部分时间<br/>不启用按需加载技术,而是预先加载模块:<br/>结果运行时间:202&nbsp;&nbsp;&lt;如果不使用Cache功能每次都要查找所花时间:1790&gt;</p>

zhigu 发表于 2006-12-6 18:51:00

UploadFile/2006-12/20061261851194242.gif<br/>
页: [1]
查看完整版本: [转帖]脚本引擎速度评测—谁是最快的脚本引擎?lua么,让我来为大家揭晓