Skip to content

Instantly share code, notes, and snippets.

@1bardesign
Last active April 10, 2022 04:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1bardesign/a93267d149b109aa31257fe42fd4c6f9 to your computer and use it in GitHub Desktop.
Save 1bardesign/a93267d149b109aa31257fe42fd4c6f9 to your computer and use it in GitHub Desktop.
a microbenchmark comparing different loop types, and different work size per-iteration
--config
local replicas = 3
local test_duration = 0.5
local single_test_size = 1e3
--per-iteration operation
function test_operation(a, b, work_size)
for _ = 1, work_size do
local s = tostring(a + b)
end
end
--different loop constructs
function use_pairs(a, work_size)
for i, v in pairs(a) do
test_operation(i, v, work_size)
end
end
function use_ipairs(a, work_size)
for i, v in ipairs(a) do
test_operation(i, v, work_size)
end
end
function use_numeric(a, work_size)
for i = 1, #a do
test_operation(i, a[i], work_size)
end
end
--test setup
function test(work_size)
--init array
local a = {}
for i = 1, single_test_size do
a[i] = i * i
end
local results = {}
for cfg_i, cfg in ipairs({
{"ipairs", use_ipairs},
{"numeric", use_numeric},
{"pairs", use_pairs},
}) do
local name, f = unpack(cfg)
--count loops
local loops = 0
local start = love.timer.getTime()
while love.timer.getTime() - start < test_duration do
f(a, work_size)
loops = loops + 1
end
--measure the actual time taken
local time_taken = love.timer.getTime() - start
--compare to first result
table.insert(results, loops)
local ratio = results[1] / results[#results]
--output
print(string.format("%10s | %8d loops | %12.3f loops/s | ratio % 8.3fx", name, loops, loops / time_taken, ratio))
--ready for next test
collectgarbage("collect")
end
end
function love.load()
for _, work_size in ipairs({
0, 1, 2, 4, 8
}) do
print("-------------------------------")
print("comparing with work size: "..work_size)
for i = 1, replicas do
print("replica", i)
test(work_size)
end
end
love.event.quit()
end
Trial Run Results
i5-4690 @ 3.50GHz, 16GB RAM
Windows 10 x64
Love 11.2
-------------------------------
comparing with work size: 0
replica 1
ipairs | 588479 loops | 1176957.656 loops/s | ratio 1.000x
numeric | 849657 loops | 1699311.514 loops/s | ratio 0.693x
pairs | 27511 loops | 55021.920 loops/s | ratio 21.391x
replica 2
ipairs | 589456 loops | 1178910.965 loops/s | ratio 1.000x
numeric | 852279 loops | 1704556.504 loops/s | ratio 0.692x
pairs | 27606 loops | 55211.273 loops/s | ratio 21.352x
replica 3
ipairs | 587989 loops | 1175976.968 loops/s | ratio 1.000x
numeric | 853027 loops | 1706052.502 loops/s | ratio 0.689x
pairs | 27566 loops | 55131.564 loops/s | ratio 21.330x
-------------------------------
comparing with work size: 1
replica 1
ipairs | 65388 loops | 130774.202 loops/s | ratio 1.000x
numeric | 66449 loops | 132897.495 loops/s | ratio 0.984x
pairs | 771 loops | 1540.362 loops/s | ratio 84.809x
replica 2
ipairs | 63015 loops | 126029.299 loops/s | ratio 1.000x
numeric | 66798 loops | 133594.163 loops/s | ratio 0.943x
pairs | 771 loops | 1540.623 loops/s | ratio 81.732x
replica 3
ipairs | 64957 loops | 129913.354 loops/s | ratio 1.000x
numeric | 67794 loops | 135586.294 loops/s | ratio 0.958x
pairs | 783 loops | 1564.903 loops/s | ratio 82.959x
-------------------------------
comparing with work size: 2
replica 1
ipairs | 781 loops | 1560.757 loops/s | ratio 1.000x
numeric | 785 loops | 1569.734 loops/s | ratio 0.995x
pairs | 417 loops | 833.122 loops/s | ratio 1.873x
replica 2
ipairs | 774 loops | 1547.051 loops/s | ratio 1.000x
numeric | 781 loops | 1561.610 loops/s | ratio 0.991x
pairs | 415 loops | 829.380 loops/s | ratio 1.865x
replica 3
ipairs | 773 loops | 1545.269 loops/s | ratio 1.000x
numeric | 751 loops | 1499.788 loops/s | ratio 1.029x
pairs | 406 loops | 810.658 loops/s | ratio 1.904x
-------------------------------
comparing with work size: 4
replica 1
ipairs | 284 loops | 567.361 loops/s | ratio 1.000x
numeric | 285 loops | 568.091 loops/s | ratio 0.996x
pairs | 218 loops | 435.634 loops/s | ratio 1.303x
replica 2
ipairs | 286 loops | 571.570 loops/s | ratio 1.000x
numeric | 287 loops | 572.868 loops/s | ratio 0.997x
pairs | 217 loops | 433.892 loops/s | ratio 1.318x
replica 3
ipairs | 287 loops | 572.192 loops/s | ratio 1.000x
numeric | 287 loops | 573.741 loops/s | ratio 1.000x
pairs | 217 loops | 433.250 loops/s | ratio 1.323x
-------------------------------
comparing with work size: 8
replica 1
ipairs | 127 loops | 252.785 loops/s | ratio 1.000x
numeric | 128 loops | 254.925 loops/s | ratio 0.992x
pairs | 112 loops | 223.323 loops/s | ratio 1.134x
replica 2
ipairs | 129 loops | 256.056 loops/s | ratio 1.000x
numeric | 129 loops | 257.458 loops/s | ratio 1.000x
pairs | 112 loops | 223.185 loops/s | ratio 1.152x
replica 3
ipairs | 128 loops | 255.384 loops/s | ratio 1.000x
numeric | 129 loops | 257.310 loops/s | ratio 0.992x
pairs | 113 loops | 225.747 loops/s | ratio 1.133x
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment