Optimization Lua挑战:您能否改进Fankuch的实施';她的表现如何? Lua目前是最快的脚本语言,它对于某些程序来说并不像C/C++那样慢(当PIDGITS 1:1时,PARS),但是LUA在对C/C++的一些基准上的评分很差。

Optimization Lua挑战:您能否改进Fankuch的实施';她的表现如何? Lua目前是最快的脚本语言,它对于某些程序来说并不像C/C++那样慢(当PIDGITS 1:1时,PARS),但是LUA在对C/C++的一些基准上的评分很差。,optimization,lua,Optimization,Lua,其中之一是Fankuch测试(对微小整数序列的索引访问),它的分数是可怕的1:148 -- The Computer Language Benchmarks Game -- http://shootout.alioth.debian.org/ -- contributed by Mike Pall local function fannkuch(n) local p, q, s, odd, check, maxflips = {}, {}, {}, true, 0, 0 for i=1

其中之一是Fankuch测试(对微小整数序列的索引访问),它的分数是可怕的1:148

-- The Computer Language Benchmarks Game
-- http://shootout.alioth.debian.org/
-- contributed by Mike Pall

local function fannkuch(n)
  local p, q, s, odd, check, maxflips = {}, {}, {}, true, 0, 0
  for i=1,n do p[i] = i; q[i] = i; s[i] = i end
  repeat
    -- Print max. 30 permutations.
    if check < 30 then
      if not p[n] then return maxflips end  -- Catch n = 0, 1, 2.
      io.write(unpack(p)); io.write("\n")
      check = check + 1
    end
    -- Copy and flip.
    local q1 = p[1]             -- Cache 1st element.
    if p[n] ~= n and q1 ~= 1 then       -- Avoid useless work.
      for i=2,n do q[i] = p[i] end      -- Work on a copy.
      for flips=1,1000000 do            -- Flip ...
    local qq = q[q1]
    if qq == 1 then             -- ... until 1st element is 1.
      if flips > maxflips then maxflips = flips end -- New maximum?
      break
    end
    q[q1] = q1
    if q1 >= 4 then
      local i, j = 2, q1 - 1
      repeat q[i], q[j] = q[j], q[i]; i = i + 1; j = j - 1; until i >= j
    end
    q1 = qq
      end
    end
    -- Permute.
    if odd then
      p[2], p[1] = p[1], p[2]; odd = false  -- Rotate 1<-2.
    else
      p[2], p[3] = p[3], p[2]; odd = true   -- Rotate 1<-2 and 1<-2<-3.
      for i=3,n do
    local sx = s[i]
    if sx ~= 1 then s[i] = sx-1; break end
    if i == n then return maxflips end  -- Out of permutations.
    s[i] = i
    -- Rotate 1<-...<-i+1.
    local t = p[1]; for j=1,i do p[j] = p[j+1] end; p[i+1] = t
      end
    end
  until false
end

local n = tonumber(arg and arg[1]) or 1
io.write("Pfannkuchen(", n, ") = ", fannkuch(n), "\n")
——计算机语言基准游戏
-- http://shootout.alioth.debian.org/
--迈克·帕尔撰稿
局部函数范库奇(n)
局部p,q,s,奇数,check,maxflips={},{},{},true,0,0
对于i=1,n do p[i]=i;q[i]=i;s[i]=i结束
重复
--最多打印30个排列。
如果检查<30,则
如果不是p[n],则返回maxflips end——Catch n=0,1,2。
io.写入(解包(p));io.write(“\n”)
检查=检查+1
结束
--复制并翻转。
本地q1=p[1]——缓存第一个元素。
如果p[n]~=n和q1~=1,那么——避免无用的工作。
对于i=2,n do q[i]=p[i]end——处理副本。
对于翻转=11000000 do--翻转。。。
本地qq=q[q1]
如果qq==1,则--。。。直到第一个元素为1。
如果“翻转>最大翻转”,则“最大翻转=翻转结束”-新的最大值?
打破
结束
q[q1]=q1
如果q1>=4,则
局部i,j=2,q1-1
重复q[i],q[j]=q[j],q[i];i=i+1;j=j-1;直到i>=j
结束
q1=qq
结束
结束
--排列。
如果奇怪的话
p[2],p[1]=p[1],p[2];奇数=假——旋转1Robert Gould>其中一个是Fankuch测试(对微小整数序列的索引访问),它的分数是可怕的1:148

-- The Computer Language Benchmarks Game
-- http://shootout.alioth.debian.org/
-- contributed by Mike Pall

local function fannkuch(n)
  local p, q, s, odd, check, maxflips = {}, {}, {}, true, 0, 0
  for i=1,n do p[i] = i; q[i] = i; s[i] = i end
  repeat
    -- Print max. 30 permutations.
    if check < 30 then
      if not p[n] then return maxflips end  -- Catch n = 0, 1, 2.
      io.write(unpack(p)); io.write("\n")
      check = check + 1
    end
    -- Copy and flip.
    local q1 = p[1]             -- Cache 1st element.
    if p[n] ~= n and q1 ~= 1 then       -- Avoid useless work.
      for i=2,n do q[i] = p[i] end      -- Work on a copy.
      for flips=1,1000000 do            -- Flip ...
    local qq = q[q1]
    if qq == 1 then             -- ... until 1st element is 1.
      if flips > maxflips then maxflips = flips end -- New maximum?
      break
    end
    q[q1] = q1
    if q1 >= 4 then
      local i, j = 2, q1 - 1
      repeat q[i], q[j] = q[j], q[i]; i = i + 1; j = j - 1; until i >= j
    end
    q1 = qq
      end
    end
    -- Permute.
    if odd then
      p[2], p[1] = p[1], p[2]; odd = false  -- Rotate 1<-2.
    else
      p[2], p[3] = p[3], p[2]; odd = true   -- Rotate 1<-2 and 1<-2<-3.
      for i=3,n do
    local sx = s[i]
    if sx ~= 1 then s[i] = sx-1; break end
    if i == n then return maxflips end  -- Out of permutations.
    s[i] = i
    -- Rotate 1<-...<-i+1.
    local t = p[1]; for j=1,i do p[j] = p[j+1] end; p[i+1] = t
      end
    end
  until false
end

local n = tonumber(arg and arg[1]) or 1
io.write("Pfannkuchen(", n, ") = ", fannkuch(n), "\n")
当你引用基准游戏中的数字时,请说明这些数字来自何处,以便读者有一些上下文

在这种情况下,您似乎已经在quadcore机器上测量了数字,其中最快的程序被重新编写以利用多个内核。而不是看经过的时间

或者查看中位数和四分位数,以获得更好的印象


或者有一整套度量,其中程序被迫只使用一个核心——如果你看一下,你会发现它们使用的是C语言GNU GMP库。

这是一个好的观点,但这方面的弱点仍然存在。因此,应该有可能获得一些提升。看看整个测量集,其中程序被迫只使用一个内核,然后似乎pi数字是例外,大多数程序都是1:20-1:30。Lua对多核/多处理/线程等不友好吗?假设所有这些测试都是编写(或调整)的由迈克·帕尔本人说,我认为这里没有什么可以做的。无论如何,在Lua邮件列表中提出这个问题会更有效: