| 1 | import os |
| 2 | import time |
| 3 | import rand |
| 4 | import math |
| 5 | |
| 6 | struct DataObj { |
| 7 | mut: |
| 8 | data []f64 |
| 9 | } |
| 10 | |
| 11 | struct PtrObj { |
| 12 | mut: |
| 13 | nxt []&DataObj |
| 14 | } |
| 15 | |
| 16 | struct PtrPtrObj { |
| 17 | mut: |
| 18 | nxt []&PtrObj |
| 19 | } |
| 20 | |
| 21 | const log2n = 11 |
| 22 | const n = 1 << log2n |
| 23 | const n4 = f64(u64(1) << (4 * log2n)) |
| 24 | |
| 25 | fn 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 | |
| 46 | fn 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 | |