Last active
July 19, 2019 14:14
-
-
Save vstakhov/67ed7aab2008801c470dc25bbba1f497 to your computer and use it in GitHub Desktop.
lua-fun
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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