12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- -- Binary trees benchmark from benchmarks game
- -- https://benchmarksgame-team.pages.debian.net/benchmarksgame/description/binarytrees.html
- --
- -- This is a small GC-focused benchmark, with not much room for clever tricks.
- -- The code used here is based on the one contributed by Mike Pall:
- -- * The leaf nodes are now store `false` instead of being empty tables.
- -- This is more consistent with what is done in other languages.
- -- * Use print instead of io.write
- -- * Use bitshift operator in Lua 5.4 and Pallene
- --
- -- Expected output (N = 21)
- -- stretch tree of depth 22 check: 8388607
- -- 2097152 trees of depth 4 check: 65011712
- -- 524288 trees of depth 6 check: 66584576
- -- 131072 trees of depth 8 check: 66977792
- -- 32768 trees of depth 10 check: 67076096
- -- 8192 trees of depth 12 check: 67100672
- -- 2048 trees of depth 14 check: 67106816
- -- 512 trees of depth 16 check: 67108352
- -- 128 trees of depth 18 check: 67108736
- -- 32 trees of depth 20 check: 67108832
- -- long lived tree of depth 21 check: 4194303
- local function BottomUpTree(depth)
- if depth > 0 then
- depth = depth - 1
- local left = BottomUpTree(depth)
- local right = BottomUpTree(depth)
- return { left, right }
- else
- return { false, false }
- end
- end
- local function ItemCheck(tree)
- if tree[1] then
- return 1 + ItemCheck(tree[1]) + ItemCheck(tree[2])
- else
- return 1
- end
- end
- local function Stress(mindepth, maxdepth, depth)
- local iterations = 1 << (maxdepth - depth + mindepth)
- local check = 0
- for _ = 1, iterations do
- local t = BottomUpTree(depth)
- check = check + ItemCheck(t)
- end
- return { iterations, check }
- end
- return function(N)
- N = N or 10
- local mindepth = 4
- local maxdepth = math.max(mindepth + 2, N)
- do
- local stretchdepth = maxdepth + 1
- local stretchtree = BottomUpTree(stretchdepth)
- print(string.format("stretch tree of depth %d\t check: %d",
- stretchdepth, ItemCheck(stretchtree)))
- end
- local longlivedtree = BottomUpTree(maxdepth)
- for depth = mindepth, maxdepth, 2 do
- local r = Stress(mindepth, maxdepth, depth)
- local iterations = r[1]
- local check = r[2]
- print(string.format("%d\t trees of depth %d\t check: %d",
- iterations, depth, check))
- end
- print(string.format("long lived tree of depth %d\t check: %d",
- maxdepth, ItemCheck(longlivedtree)))
- end
|