编程语言
首页 > 编程语言> > lua5.4.2(使用Lua54程序) 与 Lu2.0(使用OpenLu程序)速度比较

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