Skip to content

Instantly share code, notes, and snippets.

@CandyMi
Last active June 1, 2023 02:54
Show Gist options
  • Save CandyMi/a47c56a1471e6895338352910add7b78 to your computer and use it in GitHub Desktop.
Save CandyMi/a47c56a1471e6895338352910add7b78 to your computer and use it in GitHub Desktop.
js vs lua in fannkuch test case from https://sabotage-linux.neocities.org/blog/9/

测试 fannkuch

名称 指标
操作系统 Debian 11 (bullseye) GNU/Linux
CPU I5-10400 2.9GHz
MEM 32G(16x2) DDR3 2667MHZ

Lua 5.4.4

root@candymi:~/app# time ./lua fannkuch.lua 11
556355
Pfannkuchen(11) = 51

real    0m23.401s
user    0m23.381s
sys     0m0.005s

top 监控:

   PID  USER   PR  NI    VIRT   RES    SHR S  %CPU    %MEM   TIME+    COMMAND             
   7109 root   20   0    3.9m   0.9m   0.8m R  100.0   0.0    0:12.80   lua

LuaJIT 2.1.0-beta3

root@candymi:~/app# time luajit fannkuch.lua 11
556355
Pfannkuchen(11) = 51

real    0m3.768s
user    0m3.756s
sys     0m0.009s

top 监控:

   PID  USER   PR  NI    VIRT    RES    SHR S  %CPU   %MEM     TIME+   COMMAND             
   7947 root   20   0    4.4m   2.2m   2.0m R 100.0   0.0    0:02.55    luajit  

QuickJS 2021-03-27

root@candymi:~/app# time qjs fannkuch.js 11
556355
Pfannkuchen(11) = 51

real    0m43.055s
user    0m43.043s
sys     0m0.001s
    PID USER   PR  NI    VIRT    RES    SHR S  %CPU  %MEM    TIME+   COMMAND             
 728581 root   20   0    4.7m   0.9m   0.8m R 100.0   0.0   0:05.51   qjs  

NodeJS v14.21.3

root@candymi:~/app# time node fannkuch.js 11
556355
Pfannkuchen(11) = 51

real    0m2.713s
user    0m2.705s
sys     0m0.009s
  PID   USER  PR  NI    VIRT    RES    SHR S   %CPU  %MEM   TIME+    COMMAND             
 734942 root  20   0  499.3m  36.0m  28.2m R  100.0   0.5   0:02.29    node  
/* The Computer Language Benchmarks Game
http://benchmarksgame.alioth.debian.org/
contributed by Isaac Gouy, transliterated from Mike Pall's Lua program
*/
function fannkuch(n) {
var p = Array(n), q = Array(n), s = Array(n);
var sign = 1, maxflips = 0, sum = 0, m = n-1;
for(var i=0; i<n; i++){ p[i] = i; q[i] = i; s[i] = i; }
do {
// Copy and flip.
var q0 = p[0]; // Cache 0th element.
if (q0 != 0){
for(var i=1; i<n; i++) q[i] = p[i]; // Work on a copy.
var flips = 1;
do {
var qq = q[q0];
if (qq == 0){ // ... until 0th element is 0.
sum += sign*flips;
if (flips > maxflips) maxflips = flips; // New maximum?
break;
}
q[q0] = q0;
if (q0 >= 3){
var i = 1, j = q0 - 1, t;
do { t = q[i]; q[i] = q[j]; q[j] = t; i++; j--; } while (i < j);
}
q0 = qq; flips++;
} while (true);
}
// Permute.
if (sign == 1){
var t = p[1]; p[1] = p[0]; p[0] = t; sign = -1; // Rotate 0<-1.
} else {
var t = p[1]; p[1] = p[2]; p[2] = t; sign = 1; // Rotate 0<-1 and 0<-1<-2.
for(var i=2; i<n; i++){
var sx = s[i];
if (sx != 0){ s[i] = sx-1; break; }
if (i == m) return Array(sum,maxflips); // Out of permutations.
s[i] = i;
// Rotate 0<-...<-i+1.
t = p[0]; for(var j=0; j<=i; j++){ p[j] = p[j+1]; } p[i+1] = t;
}
}
} while (true);
}
if (typeof(scriptArgs) == 'object')
arguments = scriptArgs.slice(1)
else if(typeof(process) != "undefined")
arguments = process.argv.slice(2)
var n = 1*arguments[0]*1;
var pf = fannkuch(n);
console.log(pf[0] + "\n" + "Pfannkuchen(" + n + ") = " + pf[1]);
-- The Computer Language Benchmarks Game
-- http://benchmarksgame.alioth.debian.org/
-- contributed by Mike Pall
local function fannkuch(n)
local p, q, s, sign, maxflips, sum = {}, {}, {}, 1, 0, 0
for i=1,n do p[i] = i; q[i] = i; s[i] = i end
repeat
-- Copy and flip.
local q1 = p[1] -- Cache 1st element.
if q1 ~= 1 then
for i=2,n do q[i] = p[i] end -- Work on a copy.
local flips = 1
repeat
local qq = q[q1]
if qq == 1 then -- ... until 1st element is 1.
sum = sum + sign*flips
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; flips = flips + 1
until false
end
-- Permute.
if sign == 1 then
p[2], p[1] = p[1], p[2]; sign = -1 -- Rotate 1<-2.
else
p[2], p[3] = p[3], p[2]; sign = 1 -- 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 sum, 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
local sum, flips = fannkuch(n)
io.write(sum, "\nPfannkuchen(", n, ") = ", flips, "\n")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment