lua5.4.2(使用Lua54程序) 与 Lu2.0(使用OpenLu程序)速度比较
作者:互联网
lua5.4.2(使用Lua54程序) 与 Lu2.0(使用OpenLu程序)速度比较
lua5.4.2(Lua54程序):请从Lua官方网站下载。
Lu2.0(OpenLu程序):http://www.forcal.net/xiazai/lu2/openlu64.zip
从网上看到,C/C++调用Lua脚本函数的效率较低,似乎只有Lua脚本内部调用函数效率的几分之一。在这个方面Lu脚本有明显的优势,C/C++调用Lu脚本函数的效率与Lu脚本内部调用函数效率几乎相同,如果说有差别,应是C/C++调用Lu脚本函数的效率要高一点。Lu脚本更适合于宿主语言与脚本之间的频繁穿越。
下面仅比较Lua脚本与Lu脚本本身的效率,结果表明,平均来说,Lua脚本比Lu脚本速度略快,但差别不大(协程尚未比较,仅给出了Lu协程的例子)。
例子1:数值计算
Lua代码:
function z()
local t = os.clock()
local mcos = math.cos
local msin = math.sin
local x=0
local y=0
local z=0
for x=0,1,0.0011 do
for y=1,2,0.0011 do
z=z+mcos(1-msin(1.2*(x+0.1)^(y/2-x)+mcos(1-msin(1.2*(x+0.2)^(y/3-x))))-mcos(1-
msin(1.2*(x+0.3)^(y/4-x)))-mcos(1-msin(1.2*(x+0.4)^(y/5-x)+mcos(1-msin(1.2*(x+0.5)^(y/6-x))))-
mcos(1-msin(1.2*(x+0.6)^(y/7-x)))))
end
end
io.write(z)
io.write(string.format(" Time Elapsed %f\n", os.clock() - t))
end
z()
Lua运行结果:
19160.536601703 Time Elapsed 1.67
Lu代码1:
mvar: //使用未定义的模块变量。变量未定义就可以使用,容易隐藏不可预知的错误,故后面不再使用这种方法
t=clock(), z=0.0, x=0.0,
while{ x<=1.0,
y=1.0,
while{ y<=2.0,
z=z+cos(1.0-sin(1.2*(x+0.1)^(y/2.0-x)+cos(1.0-sin(1.2*(x+0.2)^(y/3.0-x))))-cos(1.0-sin(1.2*(x+0.3)^(y/4.0-x)))-cos(1.0-sin(1.2*(x+0.4)^(y/5.0-x)+cos(1.0-sin(1.2*(x+0.5)^(y/6.0-x))))-cos(1.0-sin(1.2*(x+0.6)^(y/7.0-x))))),
y=y+0.0011
},
x=x+0.0011
},
o{"z=",z,",耗时约",[clock()-t]/1000.0,"秒。\r\n"};;
Lu运行结果:
z=19160.536601703152,耗时约0.875秒。
Lu代码2:
//函数main中,x, y, z, t都是预先声明的自动变量,如果这些变量放在两个冒号后,就成为模块变量,执行效率与上例相同。模块变量比自动变量效率稍高
main(: x, y, z, t)= //函数名main不是必须的,后面将予以省略
{
t=clock(), z=0.0, x=0.0,
while{ x<=1.0,
y=1.0,
while{ y<=2.0,
z=z+cos(1.0-sin(1.2*(x+0.1)^(y/2.0-x)+cos(1.0-sin(1.2*(x+0.2)^(y/3.0-x))))-cos(1.0-sin(1.2*(x+0.3)^(y/4.0-x)))-cos(1.0-sin(1.2*(x+0.4)^(y/5.0-x)+cos(1.0-sin(1.2*(x+0.5)^(y/6.0-x))))-cos(1.0-sin(1.2*(x+0.6)^(y/7.0-x))))),
y=y+0.0011
},
x=x+0.0011
},
o{"z=",z,",耗时约",[clock()-t]/1000.0,"秒。\r\n"}
};
Lu运行结果:
z=19160.536601703152,耗时约0.962秒。
例子2:计算π
Lua代码:
function z()
local t = os.clock()
local pi=0.0
local MaxK=10000000
local i=0
while(i<MaxK)
do
pi = pi + 1.0 / ((4 * i + 1) * (2 * i + 1) * (i + 1))
i = i + 1
end
pi = pi * 3
io.write(pi)
io.write(string.format(" Time Elapsed %f\n", os.clock() - t))
end
z()
Lua运行结果:
3.1415926535536 Time Elapsed 0.731000
Lu代码:
(: pi, t, i, MaxK) =
t= clock(),
pi=0.0, MaxK=10000000, i=0,
while{ i<MaxK,
pi = pi + 1.0 / ((4 * i + 1) * (2 * i + 1) * (i + 1)),
i++
},
pi = pi*3,
o{pi," time=",[clock()-t]/1000.0, "\r\n"};;
Lu运行结果:
3.1415926535535581 time=1.22
例子3:函数调用
Lua代码:
function f(x, y)
return x+y;
end
function z()
local t = os.clock()
local pi=0.0
local MaxK=1000000
local i=0
while(i<MaxK)
do
pi = pi + 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))
i = i + 1
end
pi = pi * 3
io.write(pi)
io.write(string.format(" Time Elapsed %f\n", os.clock() - t))
end
z()
Lua运行结果:
50.265482456022 Time Elapsed 3.1780
Lu代码:
f(x, y) = x + y;
(:pi, t, i, MaxK) =
t= clock(),
pi=0.0,
MaxK=1000000,
i=0,
while{ i<MaxK,
pi = pi + 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1))+ 1.0 / (f(4 * i , 1) *f (2 * i , 1) *f (i , 1)),
i++
},
pi = pi*3,
o{pi," time=",[clock()-t]/1000.0, "\r\n"};;
Lu运行结果:
50.265482456021743 time=3.16
例子4:函数返回多个参数
Lua代码:
function f(x, y)
return x+y;
end
function g(x)
return 4*x, 2*x , x;
end
function h(x)
return 4*x, 2*x , -6*x;
end
function z()
local t = os.clock()
local pi=0.0
local MaxK=1000000
local i=0
local a
local b
local c
local d
local e
local m
while(i<MaxK)
do
a,b,c=g(i)
d,e,m=h(i)
a,b,c=g(i)
d,e,m=h(i)
a,b,c=g(i)
d,e,m=h(i)
pi = pi + 1.0 / (f(a , 1) *f (b , 1) *f (c , 1)) +d +e +m
i = i + 1
end
pi = pi * 3
io.write(pi)
io.write(string.format(" Time Elapsed %f\n", os.clock() - t))
end
z()
Lua运行结果:
3.1415926404297 Time Elapsed 0.70
Lu代码:
f(x, y) = x+y;
g(x, a, b, c)= a=4*x, b=2*x , c=x;
h(x, a, b, c)= a=4*x, b=2*x , c=-6*x;
(:pi, t, i, MaxK, a, b, c, d, e, m)=
t= clock(),
pi=0.0,
MaxK=1000000,
i=0,
while{ i<MaxK,
g(i, &a, &b, &c), h(i, &d, &e, &m),
g(i, &a ,&b, &c), h(i, &d, &e, &m),
g(i, &a, &b, &c), h(i, &d, &e, &m),
pi = pi + 1.0 / (f(a , 1) *f (b , 1) *f (c , 1)) +d +e +m,
i++
},
pi = pi*3,
o{pi," time=",[clock()-t]/1000.0, "\r\n"};;
Lu运行结果:
3.1415926404297352 time=1.10
例子5:递归调用
Lua代码:
function fib(n)
if n<2 then
return n
else
return fib(n-2)+fib(n-1)
end
end
function z( )
local N=40
local t=os.clock()
print("计算结果:"..fib(N).." 计算"..N.."个斐波那契数列耗时:"..(os.clock()-t).."秒")
end
z( )
Lua运行结果:
计算结果:102334155 计算40个斐波那契数列耗时:14.433秒
Lu代码:
SetStackMax[1000];;
fib(n)= which{ n<2 : n; fib(n-2)+fib(n-1)};
(:n,t) = n=40, t=clock(), o{"计算结果:", fib(n), " 计算", n, "个斐波那契数列耗时:",(clock()-t)/1000.0, "秒\r\n"};
Lu运行结果:
计算结果:102334155 计算40个斐波那契数列耗时:21.505秒
例子6:动态对象 Lua table(表) 及 Lu lu(表)
Lua代码:
function z()
local t=os.clock()
local s=0
local i
for i=1, 1000000 do
local a1 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b1 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a2 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b2 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a3 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b3 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a4 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b4 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a5 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b5 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a6 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b6 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a7 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b7 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a8 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b8 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a9 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b9 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a10 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b10 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a11 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b11 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local a12 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
local b12 = {1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}
s=s +a1[3]+b1[3]+a2[3]+b2[3]+a3[3]+b3[3]+a4[3]+b4[3]+a5[3]+b5[3]+a6[3]+b6[3]+a7[3]+b7[3]+a8[3]+b8[3]+a9[3]+b9[3]+a10[3]+b10[3]+a11[3]+b11[3]+a12[3]+b12[3]
end
print("s= "..s.." 耗时:"..(os.clock()-t).."秒")
end
z()
Lua运行结果:
s= 72000000 耗时:7.781秒
Lu代码:
(:i, a, b, s, t, a1, b1, a2, b2, a3, b3, a4, b4, a5, b5, a6, b6, a7, b7, a8, b8, a9, b9, a10, b10, a11, b11, a12, b12) =
t=clock( ), s=0,
i=0, while{ i<1000000,
a1=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b1=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a2=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b2=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a3=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b3=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a4=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b4=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a5=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b5=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a6=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b6=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a7=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b7=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a8=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b8=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a9=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b9=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a10=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b10=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a11=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b11=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
a12=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0}, b12=lu{1, 2, 3,4,5,6,7,8,9,0,1, 2, 3,4,5,6,7,8,9,0},
s=s +a1[2]+b1[2]+a2[2]+b2[2]+a3[2]+b3[2]+a4[2]+b4[2]+a5[2]+b5[2]+a6[2]+b6[2]+a7[2]+b7[2]+a8[2]+b8[2]+a9[2]+b9[2]+a10[2]+b10[2]+a11[2]+b11[2]+a12[2]+b12[2],
i++
},
o{"s= ",s, "耗时:",(clock()-t)/1000.0, "秒\r\n"};
Lu运行结果:
s= 72000000耗时:8.975秒
例子6:协程
Lu代码:
f1(x : a : c1)= a=0, c1=0, while{true, c1++, a = a + x, yield(a)}; //自动变量a对自变量x的值进行累加,模块变量c1记录f1的执行次数
f2(x : a : c2)= a=0, c2=0, while{true, c2++, a = a + x, yield(a)}; //自动变量a对自变量x的值进行累加,模块变量c2记录f2的执行次数
f3(x : a : c3)= a=0, c3=0, while{true, c3++, a = a + x, yield(a)}; //自动变量a对自变量x的值进行累加,模块变量c3记录f3的执行次数
main(:i, t : c1, c2, c3) =
{
t=clock(), //获取时间
i=-1, while{++i<10000000, which{i%5 : f1[i]; i%3 : f2[i]; f3[i]}}, //i%5不等于0时调用f1;i%3不等于0时调用f2;否则调用f3
o{"协程f1的终值=",f1[0],",协程f2的终值=",f2[0],",协程f3的终值=",f3[0],"\r\n"},
o{"协程总执行次数c1+c2+c3=",c1+c2+c3,",c1=",c1,",c2=",c2,",c3=",c3,",耗时约",[clock()-t]/1000.0,"秒。\r\n"}
};;
Lu运行结果:
协程f1的终值=40000000000000,协程f2的终值=6666663333335,协程f3的终值=3333331666665
协程总执行次数c1+c2+c3=10000003,c1=8000001,c2=1333334,c3=666668,耗时约1.33秒。
标签:function,lua5.4,clock,程序,while,Lua,Lu2.0,Lu,local 来源: https://blog.csdn.net/forcal/article/details/118344522