Last active
April 10, 2022 04:27
-
-
Save 1bardesign/a93267d149b109aa31257fe42fd4c6f9 to your computer and use it in GitHub Desktop.
a microbenchmark comparing different loop types, and different work size per-iteration
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
--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 |
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
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