v2 / vlib / v / tests / bench / gcboehm / GC_bench.v
63 lines · 57 sloc · 1.16 KB · f09826e928f9612bab9299faefff7cf34a503362
Raw
1import os
2import time
3import rand
4import math
5
6struct DataObj {
7mut:
8 data []f64
9}
10
11struct PtrObj {
12mut:
13 nxt []&DataObj
14}
15
16struct PtrPtrObj {
17mut:
18 nxt []&PtrObj
19}
20
21const log2n = 11
22const n = 1 << log2n
23const n4 = f64(u64(1) << (4 * log2n))
24
25fn waste_mem() {
26 mut objs := PtrPtrObj{
27 nxt: unsafe { []&PtrObj{len: n} }
28 }
29 for {
30 sz := rand.int_in_range(10, 1000) or { 10 }
31 mut new_obj := &PtrObj{
32 nxt: unsafe { []&DataObj{len: sz} }
33 }
34 sz2 := rand.int_in_range(10, 500000) or { 10 }
35 new_obj2 := &DataObj{
36 data: unsafe { []f64{len: sz2} }
37 }
38 idx2 := rand.int_in_range(0, sz) or { 0 }
39 new_obj.nxt[idx2] = new_obj2
40 // non-equally distributed random index
41 idx := int(math.sqrt(math.sqrt(rand.f64n(n4) or { 0.0 })))
42 objs.nxt[idx] = new_obj
43 }
44}
45
46fn main() {
47 mut n_iterations := 5_000_000
48 if os.args.len == 2 {
49 n_iterations = os.args[1].int()
50 }
51 if os.args.len > 2 || n_iterations <= 0 {
52 eprintln('usage:\n\t${os.args[0]} [num_iterations]')
53 exit(1)
54 }
55 spawn waste_mem()
56 mut last := time.sys_mono_now()
57 for _ in 0 .. n_iterations {
58 now := time.sys_mono_now()
59 interval := now - last
60 println(f64(interval) / f64(time.millisecond))
61 last = now
62 }
63}
64