Skip to content

Instantly share code, notes, and snippets.

@vstakhov
Last active July 19, 2019 14:14
Show Gist options
  • Save vstakhov/67ed7aab2008801c470dc25bbba1f497 to your computer and use it in GitHub Desktop.
Save vstakhov/67ed7aab2008801c470dc25bbba1f497 to your computer and use it in GitHub Desktop.
lua-fun
local fun = require "fun"
local rspamd_util = require "rspamd_util"
local l = require "rspamd_logger"
-- filter(map(ls))
local function t(inp, f)
return fun.filter(function(map_elt) return map_elt end,
fun.map(function(list_elt)
return f(list_elt)
end, inp))
end
-- map(filter(ls))
local function tt(inp, f)
return fun.map(function(list_elt)
return f(list_elt)
end, fun.filter(function(elt) return elt end, inp))
end
-- map(ls)
local function ttt(inp, f)
return fun.map(function(list_elt)
return f(list_elt)
end, inp)
end
-- filter(f, ls)
local function tttt(inp, f)
return fun.filter(function(list_elt)
return f(list_elt)
end, inp)
end
-- plain cycle
local function ttttt(inp, f)
local res = {}
for i,v in ipairs(inp) do
res[i] = f(v)
end
return res
end
local function plain_sum(inp)
local res = 0
for _,v in ipairs(inp) do
res = res + v
end
return res
end
local function fold_sum(ls)
return fun.foldl(function(x, y) return x + y end, 0, ls)
end
local nelts = 100500
local inp = {}
for i=1,nelts do
inp[i] = math.random()
end
local function test(func, name, foldf)
local niter = 1000
local diff = 0
local diff_fold = 0
local s = 0
for i=1,niter do
collectgarbage()
local t1 = rspamd_util.get_ticks()
local res = func(inp, math.sin)
local t2 = rspamd_util.get_ticks()
diff = diff + (t2 - t1)
t1 = rspamd_util.get_ticks()
local val = foldf(res)
t2 = rspamd_util.get_ticks()
diff_fold = diff_fold + (t2 - t1)
s = s + val
collectgarbage()
end
l.messagex('%s: time func=%s; fold=%s; val=%s', name, diff, diff_fold, s)
end
test(t, 'filter + map + foldl', fold_sum)
test(tt, 'map + filter + foldl', fold_sum)
test(ttt, 'map + foldl', fold_sum)
test(tttt, 'filter + foldl', fold_sum)
test(ttttt, 'cycle + foldl', fold_sum)
--[[
LuaJIT 2.0
filter + map + foldl: time func=0.0019010091200470924; fold=4.317008004523814; val=46234278.889732614
map + filter + foldl: time func=0.001676015555858612; fold=6.638360006734729; val=46234278.889732614
map + foldl: time func=0.0012440094724297523; fold=10.758545987308025; val=46234278.889732614
filter + foldl: time func=0.0010179858654737473; fold=2.348349004983902; val=50293914.69295832
cycle + foldl: time func=3.714070998132229; fold=3.8378949956968427; val=46234278.889732614
cycle + plain_sum: time func=3.6558159990236163; fold=0.0957300066947937; val=46234278.889732614
LuaJIT 2.1-b3
filter + map + foldl: time func=0.00800006277859211; fold=3.372026381082833; val=46146206.85512095
map + filter + foldl: time func=0; fold=3.5360276801511645; val=46146206.85512095
map + foldl: time func=0; fold=3.5560278240591288; val=46146206.85512095
filter + foldl: time func=0; fold=3.492027333006263; val=50193951.78263647
cycle + foldl: time func=1.8160142078995705; fold=0.11200087796896696; val=46146206.85512095
cycle + plain_sum: time func=1.7120134085416794; fold=0.12400096468627453; val=46146206.85512095
Lua 5.3
filter + map + foldl: time func=0.025375978089869022; fold=64.7874129973352; val=46193538.27372886
map + filter + foldl: time func=0.028493007645010948; fold=58.805209995247424; val=46193538.27372886
map + foldl: time func=0.021190007217228413; fold=33.97564097773284; val=46193538.27372886
filter + foldl: time func=0.01933401543647051; fold=45.22902699839324; val=50240164.46189831
cycle + foldl: time func=11.943004018627107; fold=16.507984983734787; val=46193538.27372886
cycle + plain_sum: time func=12.669342995621264; fold=4.193769999779761; val=46193538.27372886
]]--
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment