1

Lua 是目前最快的脚本语言,对于某些程序来说,它并不比 C/C++ 慢多少(与 pidgits 1:1 相当),但是 Lua 在一些针对 C/C++ 的基准测试中得分非常低。

其中之一是谱范数测试(使用幂法 N=5,500 的特征值),它的得分是可怕的 1:148

-- The Computer Language Shootout
-- http://shootout.alioth.debian.org/
-- contributed by Isaac Gouy, tuned by Mike Pall

local function A(i, j)   
    local ij = i + j   
    return 1.0 / (ij * (ij + 1) * 0.5 + i + 1) 
end

local function Av(n, x, y)   
    for i = 0, n - 1 do
        local a = 0
        for j = 0, n - 1 do 
            a = a + A(i,j) * x[j] 
        end
        y[i] = a   
    end 
end

local function Atv(n, x, y)   
    for i = 0, n - 1 do
        local a = 0
        for j = 0, n - 1 do 
            a = a + A(j,i) * x[j] 
        end
        y[i] = a   
    end 
end

local function AtAv(n, x, y, t)   
    Av(n, x, t)   
    Atv(n, t, y) 
end


local n = tonumber(arg and arg[1]) or 100 
local u, v, t = {}, {}, {} 
for i = 0, n - 1 do 
    u[i] = 1 
end

for i = 1, 10 do 
    AtAv(n, u, v, t) 
    AtAv(n, v, u, t) 
end

local vBv, vv = 0, 0 
for i = 0, n - 1 do  
    local ui, vi = u[i], v[i]   
    vBv = vBv + ui * vi   
    vv = vv + vi * vi 
end

io.write(string.format("%0.9f\n", math.sqrt(vBv / vv)))

那么如何优化它(当然,与任何优化一样,您必须测量您的实现以确保它更快)。并且你不能为此改变 Lua 的 C 核心,或者使用 LuaJit,它是关于寻找优化 Lua 弱点之一的方法。

4

1 回答 1

4

罗伯特·古尔德:

其中之一是谱范数测试(使用幂法 N=5,500 的特征值),它的得分是可怕的 1:148

当您引用基准游戏中的数字时,请说明这些数字的来源,以便读者了解一些背景信息。

在这种情况下,您似乎已经在四核机器上测量了数字,其中最快的程序已被重写以利用多核。而不是查看按 CPU 时间排序的经过时间,您会看到比率下降到1:24

或者查看中位数和四分位数,以便更好地了解 C++ 测量集与 Lua 测量集的比较

或者有一整套测量程序被迫只使用一个内核 - Lua 与 C++ 相比- 如果你看一下那些 Lua pi-digits程序,你会发现它们使用 C 语言 GNU GMP 库。

于 2009-02-20T22:29:44.133 回答