ref: 09e7cfb56388b1ea79ee7e100e52cb5b34e6017c
dir: /bench/copious-allocs.myr/
use std
use testr
type blob = struct
x : int[10]
;;
const main = {
testr.bench([
[.name="alloc-one", .fn=alloc_one],
[.name="allocmany-fwdfwd", .fn=alloc_fwdfwd],
[.name="allocmany-fwdrev", .fn=alloc_fwdrev],
[.name="allocmany-fwdrand", .fn=alloc_fwdrand],
][:])
}
const alloc_one = {ctx
var a : int#
for var i = 0; i < 1000; i++
a = std.alloc()
std.free(a)
;;
}
const alloc_fwdfwd = {ctx
var a : blob#[10000]
/* alloc forwards, dealloc forwards */
for var i = 0; i < a.len; i++
a[i] = std.alloc()
;;
for var i = 0; i < a.len; i++
std.free(a[i])
;;
}
const alloc_fwdrev = {ctx
var a : blob#[10000]
/* alloc forwards, dealloc backwards */
for var i = 0; i < a.len; i++
a[i] = std.alloc()
;;
for var i = a.len; i > 0; i--
std.free(a[i - 1])
;;
}
const alloc_fwdrand = {ctx
var a : blob#[10000]
/* alloc forwards, dealloc randomly */
for var i = 0; i < a.len; i++
a[i] = std.alloc()
;;
shuffle(a[:])
for var i = a.len; i > 0; i--
std.free(a[i - 1])
;;
}
const shuffle = {a
var t
var rng
var j
/* we want determinism for benchmarking */
rng = std.mksrng(123)
for var i = 0; i < a.len - 1; i++
j = std.rngrand(rng, i, a.len)
t = a[j]
a[j] = a[i]
a[i] = t
;;
}