1
Fork 0

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.
This commit is contained in:
Lucas Schwiderski 2022-10-11 21:47:23 +02:00
parent 3728a0e911
commit f4493fe5ce
Signed by: lucas
GPG key ID: AA12679AAA6DF4D8
3 changed files with 411 additions and 0 deletions

View file

@ -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.

View file

@ -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

68
vararg-iteration/run.lua Normal file
View file

@ -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