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