From f4493fe5cebf976840f7d56e94a3432e018fe6cf Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Tue, 11 Oct 2022 21:47:23 +0200 Subject: [PATCH] Implement benchmark vararg iteration This pits various ways to iterate over varargs against each other, primarily `select` vs `ipairs{...}`. This initial version is taken from DarkWiiPlayer. --- vararg-iteration/README.adoc | 7 + vararg-iteration/results.log | 336 +++++++++++++++++++++++++++++++++++ vararg-iteration/run.lua | 68 +++++++ 3 files changed, 411 insertions(+) create mode 100644 vararg-iteration/README.adoc create mode 100644 vararg-iteration/results.log create mode 100644 vararg-iteration/run.lua diff --git a/vararg-iteration/README.adoc b/vararg-iteration/README.adoc new file mode 100644 index 0000000..a015d8c --- /dev/null +++ b/vararg-iteration/README.adoc @@ -0,0 +1,7 @@ += vararg iteration + +This compares the performance of various approaches to iterate over the arguments of a variadic function. + +== Credits + +Created by https://github.com/DarkWiiPlayer at https://gist.github.com/DarkWiiPlayer/a6496cbce062ebe5d534e4b881d4efef. diff --git a/vararg-iteration/results.log b/vararg-iteration/results.log new file mode 100644 index 0000000..773b4ba --- /dev/null +++ b/vararg-iteration/results.log @@ -0,0 +1,336 @@ +== SYSTEM INFORMATION +CPU: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz +Kernel: 5.19.13-zen1-1-zen + +== TEST RESULTS + +Lua: lua5.1 + +Number of elements: 2 +Number of iterations: 2097152 +---- STARTING TEST ---- +numeric for: 0.552162 +ipairs{...}: 0.690995 +select : 0.286485 +combination: 0.25396 + +Number of elements: 4 +Number of iterations: 1048576 +---- STARTING TEST ---- +numeric for: 0.417153 +ipairs{...}: 0.545133 +select : 0.328147 +combination: 0.310883 + +Number of elements: 8 +Number of iterations: 524288 +---- STARTING TEST ---- +numeric for: 0.348244 +ipairs{...}: 0.471477 +select : 0.367715 +combination: 0.371746 + +Number of elements: 16 +Number of iterations: 262144 +---- STARTING TEST ---- +numeric for: 0.302945 +ipairs{...}: 0.428739 +select : 0.443048 +combination: 0.418883 + +Number of elements: 32 +Number of iterations: 131072 +---- STARTING TEST ---- +numeric for: 0.288698 +ipairs{...}: 0.415577 +select : 0.602379 +combination: 0.39393 + +Number of elements: 64 +Number of iterations: 65536 +---- STARTING TEST ---- +numeric for: 0.267878 +ipairs{...}: 0.406569 +select : 0.964695 +combination: 0.390686 + +Number of elements: 128 +Number of iterations: 32768 +---- STARTING TEST ---- +numeric for: 0.254064 +ipairs{...}: 0.384773 +select : 1.625094 +combination: 0.383372 + +Number of elements: 256 +Number of iterations: 16384 +---- STARTING TEST ---- +numeric for: 0.247988 +ipairs{...}: 0.384708 +select : 2.943422 +combination: 0.381021 + +Lua: lua5.2 + +Number of elements: 2 +Number of iterations: 2097152 +---- STARTING TEST ---- +numeric for: 0.560537 +ipairs{...}: 0.746473 +select : 0.537075 +combination: 0.609935 + +Number of elements: 4 +Number of iterations: 1048576 +---- STARTING TEST ---- +numeric for: 0.436931 +ipairs{...}: 0.563225 +select : 0.487017 +combination: 0.519111 + +Number of elements: 8 +Number of iterations: 524288 +---- STARTING TEST ---- +numeric for: 0.363167 +ipairs{...}: 0.465143 +select : 0.474101 +combination: 0.489039 + +Number of elements: 16 +Number of iterations: 262144 +---- STARTING TEST ---- +numeric for: 0.324731 +ipairs{...}: 0.414151 +select : 0.530607 +combination: 0.446816 + +Number of elements: 32 +Number of iterations: 131072 +---- STARTING TEST ---- +numeric for: 0.306231 +ipairs{...}: 0.392634 +select : 0.661512 +combination: 0.408606 + +Number of elements: 64 +Number of iterations: 65536 +---- STARTING TEST ---- +numeric for: 0.305991 +ipairs{...}: 0.372077 +select : 1.049758 +combination: 0.379606 + +Number of elements: 128 +Number of iterations: 32768 +---- STARTING TEST ---- +numeric for: 0.287538 +ipairs{...}: 0.372301 +select : 1.77883 +combination: 0.369424 + +Number of elements: 256 +Number of iterations: 16384 +---- STARTING TEST ---- +numeric for: 0.287302 +ipairs{...}: 0.358031 +select : 3.178964 +combination: 0.363598 + +Lua: lua5.3 + +Number of elements: 2 +Number of iterations: 2097152 +---- STARTING TEST ---- +numeric for: 0.46859 +ipairs{...}: 0.640256 +select : 0.437587 +combination: 0.483519 + +Number of elements: 4 +Number of iterations: 1048576 +---- STARTING TEST ---- +numeric for: 0.364446 +ipairs{...}: 0.466707 +select : 0.390046 +combination: 0.423592 + +Number of elements: 8 +Number of iterations: 524288 +---- STARTING TEST ---- +numeric for: 0.285324 +ipairs{...}: 0.36883 +select : 0.386637 +combination: 0.402977 + +Number of elements: 16 +Number of iterations: 262144 +---- STARTING TEST ---- +numeric for: 0.247901 +ipairs{...}: 0.323775 +select : 0.438333 +combination: 0.341976 + +Number of elements: 32 +Number of iterations: 131072 +---- STARTING TEST ---- +numeric for: 0.234862 +ipairs{...}: 0.302702 +select : 0.545853 +combination: 0.317096 + +Number of elements: 64 +Number of iterations: 65536 +---- STARTING TEST ---- +numeric for: 0.220949 +ipairs{...}: 0.290624 +select : 0.8336 +combination: 0.292184 + +Number of elements: 128 +Number of iterations: 32768 +---- STARTING TEST ---- +numeric for: 0.213136 +ipairs{...}: 0.28163 +select : 1.308727 +combination: 0.279163 + +Number of elements: 256 +Number of iterations: 16384 +---- STARTING TEST ---- +numeric for: 0.215232 +ipairs{...}: 0.272502 +select : 2.274558 +combination: 0.273622 + +Lua: lua5.4 + +Number of elements: 2 +Number of iterations: 2097152 +---- STARTING TEST ---- +numeric for: 0.373074 +ipairs{...}: 0.512667 +select : 0.368981 +combination: 0.426854 + +Number of elements: 4 +Number of iterations: 1048576 +---- STARTING TEST ---- +numeric for: 0.330613 +ipairs{...}: 0.42877 +select : 0.371128 +combination: 0.427162 + +Number of elements: 8 +Number of iterations: 524288 +---- STARTING TEST ---- +numeric for: 0.218039 +ipairs{...}: 0.378982 +select : 0.42071 +combination: 0.388871 + +Number of elements: 16 +Number of iterations: 262144 +---- STARTING TEST ---- +numeric for: 0.207389 +ipairs{...}: 0.314401 +select : 0.466114 +combination: 0.325659 + +Number of elements: 32 +Number of iterations: 131072 +---- STARTING TEST ---- +numeric for: 0.203002 +ipairs{...}: 0.265324 +select : 0.530656 +combination: 0.311731 + +Number of elements: 64 +Number of iterations: 65536 +---- STARTING TEST ---- +numeric for: 0.194642 +ipairs{...}: 0.310673 +select : 0.909296 +combination: 0.280604 + +Number of elements: 128 +Number of iterations: 32768 +---- STARTING TEST ---- +numeric for: 0.14598 +ipairs{...}: 0.276733 +select : 1.36814 +combination: 0.260261 + +Number of elements: 256 +Number of iterations: 16384 +---- STARTING TEST ---- +numeric for: 0.141446 +ipairs{...}: 0.244541 +select : 2.375652 +combination: 0.243239 + +Lua: luajit + +Number of elements: 2 +Number of iterations: 2097152 +---- STARTING TEST ---- +numeric for: 0.222393 +ipairs{...}: 0.221411 +select : 0.121801 +combination: 0.112205 + +Number of elements: 4 +Number of iterations: 1048576 +---- STARTING TEST ---- +numeric for: 0.126469 +ipairs{...}: 0.122567 +select : 0.138826 +combination: 0.134571 + +Number of elements: 8 +Number of iterations: 524288 +---- STARTING TEST ---- +numeric for: 0.076119 +ipairs{...}: 0.075873 +select : 0.181403 +combination: 0.173958 + +Number of elements: 16 +Number of iterations: 262144 +---- STARTING TEST ---- +numeric for: 0.056428 +ipairs{...}: 0.056107 +select : 0.274034 +combination: 0.066305 + +Number of elements: 32 +Number of iterations: 131072 +---- STARTING TEST ---- +numeric for: 0.041979 +ipairs{...}: 0.043606 +select : 0.478121 +combination: 0.051035 + +Number of elements: 64 +Number of iterations: 65536 +---- STARTING TEST ---- +numeric for: 0.033367 +ipairs{...}: 0.035739 +select : 0.808869 +combination: 0.040126 + +Number of elements: 128 +Number of iterations: 32768 +---- STARTING TEST ---- +numeric for: 0.025935 +ipairs{...}: 0.029247 +select : 1.473057 +combination: 0.034267 + +Number of elements: 256 +Number of iterations: 16384 +---- STARTING TEST ---- +numeric for: 0.023097 +ipairs{...}: 0.026557 +select : 2.668443 +combination: 0.030818000000001 + diff --git a/vararg-iteration/run.lua b/vararg-iteration/run.lua new file mode 100644 index 0000000..56281f6 --- /dev/null +++ b/vararg-iteration/run.lua @@ -0,0 +1,68 @@ +local unpack = table.unpack or +function(tab) + return table.remove(tab,1), unpack(tab) +end + +function try(fnc,n,...) + name = name or "" + ts = os.clock() + for i=1,n do + fnc(...) + end + te = os.clock() + print(te-ts) +end + +for i=1,8 do + values = {} + n = 2^i + print(("Number of elements: %i"):format(n)) + for i=1,n*2 do + values[#values+1]=i + end + n = 2^22 / n + print(("Number of iterations: %i"):format(n)) + + print("---- STARTING TEST ----") + + io.write "numeric for: " + try(function(...) + args = {...} + for i=1,#args do + a = args[i] + end + end, n, unpack(values)) + + io.write "ipairs{...}: " + try(function(...) + args = {...} + for key, value in ipairs(args) do + a = value + end + end, n, unpack(values)) + + io.write "select : " + try(function(...) + for i=1,select("#",...) do + a = select(i,...) + end + end, n, unpack(values)) + + ---[[ + io.write "combination: " + try(function(...) + n_args = select("#",...) + if n_args<=16 then + for i=1,n_args do + a = select(i,...) + end + else + args = {...} + for key, value in ipairs(args) do + a = value + end + end + end, n, unpack(values)) + --]] + print() +end