From 10bf974cda32f1de9916662ddc5da59747ad3baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kr=C3=BCger?= <45282134+UweKrueger@users.noreply.github.com> Date: Wed, 14 Apr 2021 00:40:26 +0200 Subject: [PATCH] all: gc: provide optimized mode (#9716) --- .github/workflows/ci.yml | 16 +- cmd/v/help/build-c.txt | 10 +- vlib/builtin/array.v | 166 +- vlib/builtin/builtin.c.v | 20 +- vlib/builtin/builtin_d_gcboehm.v | 2 + vlib/builtin/builtin_notd_gcboehm.v | 2 + vlib/v/gen/c/array.v | 11 +- vlib/v/gen/c/cgen.v | 68 +- vlib/v/gen/c/cmain.v | 12 +- vlib/v/gen/c/fn.v | 5 +- vlib/v/gen/c/json.v | 3 +- vlib/v/markused/markused.v | 8 + vlib/v/pref/pref.v | 22 +- .../bench/gcboehm/GC_Ryzen_3800X_Linux.pdf | Bin 136323 -> 19044 bytes .../bench/gcboehm/GC_Ryzen_3800X_Linux.svg | 10619 ++++++++++++++++ vlib/v/tests/bench/gcboehm/GC_bench.plt | 16 +- vlib/v/tests/bench/gcboehm/GC_bench.v | 45 +- vlib/v/tests/bench/gcboehm/GC_bench_full.plt | 9 + vlib/v/tests/bench/gcboehm/GC_bench_incr.plt | 9 + .../tests/bench/gcboehm/GC_bench_non_opt.plt | 9 + vlib/v/tests/bench/gcboehm/GC_bench_opt.plt | 9 + vlib/v/tests/bench/gcboehm/Makefile | 48 +- vlib/v/tests/bench/gcboehm/Resources.plt | 45 + .../gcboehm/Resources_Ryzen_3800X_Linux.pdf | Bin 0 -> 18959 bytes .../gcboehm/Resources_Ryzen_3800X_Linux.svg | 613 + vlib/v/tests/bench/gcboehm/resources.txt | 6 + 26 files changed, 11724 insertions(+), 49 deletions(-) create mode 100644 vlib/v/tests/bench/gcboehm/GC_Ryzen_3800X_Linux.svg create mode 100644 vlib/v/tests/bench/gcboehm/GC_bench_full.plt create mode 100644 vlib/v/tests/bench/gcboehm/GC_bench_incr.plt create mode 100644 vlib/v/tests/bench/gcboehm/GC_bench_non_opt.plt create mode 100644 vlib/v/tests/bench/gcboehm/GC_bench_opt.plt create mode 100644 vlib/v/tests/bench/gcboehm/Resources.plt create mode 100644 vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.pdf create mode 100644 vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.svg create mode 100644 vlib/v/tests/bench/gcboehm/resources.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 27ed55ab0c..a1d2cf2a33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,27 +124,27 @@ jobs: run: | thirdparty/tcc/tcc.exe -version ./v -cg -o v cmd/v # Make sure vtcc can build itself twice - - name: v self compilation with -gc boehm + - name: v self compilation with -gc boehm_full_opt run: | - ./v -gc boehm -o v2 cmd/v && ./v2 -gc boehm -o v3 cmd/v && ./v3 -gc boehm -o v4 cmd/v + ./v -gc boehm_full_opt -o v2 cmd/v && ./v2 -gc boehm_full_opt -o v3 cmd/v && ./v3 -gc boehm_full_opt -o v4 cmd/v mv v4 v - name: v doctor run: | ./v doctor - - name: Verify `v -gc boehm test` works + - name: Verify `v -gc boehm_full_opt test` works run: | - ./v -gc boehm cmd/tools/test_if_v_test_system_works.v + ./v -gc boehm_full_opt cmd/tools/test_if_v_test_system_works.v ./cmd/tools/test_if_v_test_system_works - - name: Self tests with `-gc boehm` with V compiler using Boehm-GC itself - run: ./v -gc boehm -silent test-self + - name: Self tests with `-gc boehm_full_opt` with V compiler using Boehm-GC itself + run: ./v -gc boehm_full_opt -silent test-self - name: Test leak detector run: | ./v -gc boehm_leak -o testcase_leak vlib/v/tests/testcase_leak.v ./testcase_leak 2>leaks.txt grep "Found 1 leaked object" leaks.txt && grep ", sz=1000," leaks.txt - - name: Test leak detector not being active for `-gc boehm` + - name: Test leak detector not being active for `-gc boehm_full_opt` run: | - ./v -gc boehm -o testcase_leak vlib/v/tests/testcase_leak.v + ./v -gc boehm_full_opt -o testcase_leak vlib/v/tests/testcase_leak.v ./testcase_leak 2>leaks.txt [ "$(stat -c %s leaks.txt)" = "0" ] - name: Test leak detector not being active for normal compile diff --git a/cmd/v/help/build-c.txt b/cmd/v/help/build-c.txt index eae53c59f2..d6890e6cbe 100644 --- a/cmd/v/help/build-c.txt +++ b/cmd/v/help/build-c.txt @@ -74,10 +74,12 @@ see also `v help build`. Use and link an optional garbage collector. Only tThe Boehm–Demers–Weiser garbage collector is supported currently with the following sub-options: - `-gc boehm` ........ selects the default mode for the architecture - `-gc boehm_full` ... full garbage collection mode - `-gc boehm_incr` ... incremental/generational garbage collection mode - `-gc boehm_leak` ... leak detection mode + `-gc boehm` ........... selects the default mode for the architecture + `-gc boehm_full` ...... full garbage collection mode + `-gc boehm_incr` ...... incremental/generational garbage collection mode + `-gc boehm_full_opt` .. optimized full garbage collection mode + `-gc boehm_incr_opt` .. optimized incremental/generational garbage collection mode + `-gc boehm_leak` ...... leak detection mode You need to install a `libgc-dev` package first, or install it manually from: diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index d40cfa2dd1..0ade62c176 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -96,7 +96,7 @@ fn (mut a array) ensure_cap(required int) { } new_size := cap * a.element_size mut new_data := &byte(0) - if a.cap > 0 { + if a.data != voidptr(0) { new_data = unsafe { realloc_data(a.data, a.cap * a.element_size, new_size) } } else { new_data = vcalloc(new_size) @@ -656,3 +656,167 @@ pub fn (data voidptr) vbytes(len int) []byte { pub fn (data &byte) vbytes(len int) []byte { return unsafe { voidptr(data).vbytes(len) } } + +// non-pub "noscan" versions of some above functions +fn __new_array_noscan(mylen int, cap int, elm_size int) array { + cap_ := if cap < mylen { mylen } else { cap } + arr := array{ + element_size: elm_size + data: vcalloc_noscan(cap_ * elm_size) + len: mylen + cap: cap_ + } + return arr +} + +fn __new_array_with_default_noscan(mylen int, cap int, elm_size int, val voidptr) array { + cap_ := if cap < mylen { mylen } else { cap } + mut arr := array{ + element_size: elm_size + data: vcalloc_noscan(cap_ * elm_size) + len: mylen + cap: cap_ + } + if val != 0 { + for i in 0 .. arr.len { + unsafe { arr.set_unsafe(i, val) } + } + } + return arr +} + +fn __new_array_with_array_default_noscan(mylen int, cap int, elm_size int, val array) array { + cap_ := if cap < mylen { mylen } else { cap } + mut arr := array{ + element_size: elm_size + data: vcalloc_noscan(cap_ * elm_size) + len: mylen + cap: cap_ + } + for i in 0 .. arr.len { + val_clone := val.clone() + unsafe { arr.set_unsafe(i, &val_clone) } + } + return arr +} + +// Private function, used by V (`nums := [1, 2, 3]`) +fn new_array_from_c_array_noscan(len int, cap int, elm_size int, c_array voidptr) array { + cap_ := if cap < len { len } else { cap } + arr := array{ + element_size: elm_size + data: vcalloc_noscan(cap_ * elm_size) + len: len + cap: cap_ + } + // TODO Write all memory functions (like memcpy) in V + unsafe { C.memcpy(arr.data, c_array, len * elm_size) } + return arr +} + +fn (a array) repeat_noscan(count int) array { + if count < 0 { + panic('array.repeat: count is negative: $count') + } + mut size := count * a.len * a.element_size + if size == 0 { + size = a.element_size + } + arr := array{ + element_size: a.element_size + data: vcalloc_noscan(size) + len: count * a.len + cap: count * a.len + } + size_of_array := int(sizeof(array)) + for i in 0 .. count { + if a.len > 0 && a.element_size == size_of_array { + ary := array{} + unsafe { C.memcpy(&ary, a.data, size_of_array) } + ary_clone := ary.clone() + unsafe { C.memcpy(arr.get_unsafe(i * a.len), &ary_clone, a.len * a.element_size) } + } else { + unsafe { C.memcpy(arr.get_unsafe(i * a.len), &byte(a.data), a.len * a.element_size) } + } + } + return arr +} + +pub fn (a &array) clone_noscan() array { + mut size := a.cap * a.element_size + if size == 0 { + size++ + } + mut arr := array{ + element_size: a.element_size + data: vcalloc_noscan(size) + len: a.len + cap: a.cap + } + // Recursively clone-generated elements if array element is array type + size_of_array := int(sizeof(array)) + if a.element_size == size_of_array { + mut is_elem_array := true + for i in 0 .. a.len { + ar := array{} + unsafe { C.memcpy(&ar, a.get_unsafe(i), size_of_array) } + if ar.len > ar.cap || ar.cap <= 0 || ar.element_size <= 0 { + is_elem_array = false + break + } + ar_clone := ar.clone() + unsafe { arr.set_unsafe(i, &ar_clone) } + } + if is_elem_array { + return arr + } + } + + if !isnil(a.data) { + unsafe { C.memcpy(&byte(arr.data), a.data, a.cap * a.element_size) } + } + return arr +} + +fn (a &array) slice_clone_noscan(start int, _end int) array { + mut end := _end + $if !no_bounds_checking ? { + if start > end { + panic('array.slice: invalid slice index ($start > $end)') + } + if end > a.len { + panic('array.slice: slice bounds out of range ($end >= $a.len)') + } + if start < 0 { + panic('array.slice: slice bounds out of range ($start < 0)') + } + } + mut data := &byte(0) + unsafe { + data = &byte(a.data) + start * a.element_size + } + l := end - start + res := array{ + element_size: a.element_size + data: data + len: l + cap: l + } + return res.clone_noscan() +} + +fn (a array) reverse_noscan() array { + if a.len < 2 { + return a + } + mut arr := array{ + element_size: a.element_size + data: vcalloc_noscan(a.cap * a.element_size) + len: a.len + cap: a.cap + } + for i in 0 .. a.len { + unsafe { arr.set_unsafe(i, a.get_unsafe(a.len - 1 - i)) } + } + return arr +} diff --git a/vlib/builtin/builtin.c.v b/vlib/builtin/builtin.c.v index 224afc275f..40f29c3421 100644 --- a/vlib/builtin/builtin.c.v +++ b/vlib/builtin/builtin.c.v @@ -302,7 +302,7 @@ pub fn realloc_data(old_data &byte, old_size int, new_size int) &byte { // Unlike `v_calloc` vcalloc checks for negative values given in `n`. pub fn vcalloc(n int) &byte { if n < 0 { - panic('calloc(<=0)') + panic('calloc(<0)') } else if n == 0 { return &byte(0) } @@ -313,6 +313,24 @@ pub fn vcalloc(n int) &byte { } } +// special versions of the above that allocate memory which is not scanned +// for pointers (but is collected) when the Boehm garbage collection is used +pub fn vcalloc_noscan(n int) &byte { + $if gcboehm ? { + $if vplayground ? { + if n > 10000 { + panic('allocating more than 10 KB is not allowed in the playground') + } + } + if n < 0 { + panic('calloc(<0)') + } + return &byte(unsafe { C.memset(C.GC_MALLOC_ATOMIC(n), 0, n) }) + } $else { + return unsafe { vcalloc(n) } + } +} + // free allows for manually freeing memory allocated at the address `ptr`. [unsafe] pub fn free(ptr voidptr) { diff --git a/vlib/builtin/builtin_d_gcboehm.v b/vlib/builtin/builtin_d_gcboehm.v index 3e6f518638..f773c3ca8b 100644 --- a/vlib/builtin/builtin_d_gcboehm.v +++ b/vlib/builtin/builtin_d_gcboehm.v @@ -34,6 +34,8 @@ $if gcboehm_leak ? { // compiled with `-gc boehm` or `-gc boehm_leak`. fn C.GC_MALLOC(n size_t) voidptr +fn C.GC_MALLOC_ATOMIC(n size_t) voidptr + fn C.GC_MALLOC_UNCOLLECTABLE(n size_t) voidptr fn C.GC_REALLOC(ptr voidptr, n size_t) voidptr diff --git a/vlib/builtin/builtin_notd_gcboehm.v b/vlib/builtin/builtin_notd_gcboehm.v index a3aae70721..44790729b5 100644 --- a/vlib/builtin/builtin_notd_gcboehm.v +++ b/vlib/builtin/builtin_notd_gcboehm.v @@ -6,6 +6,8 @@ module builtin fn C.GC_MALLOC(n size_t) voidptr +fn C.GC_MALLOC_ATOMIC(n size_t) voidptr + fn C.GC_MALLOC_UNCOLLECTABLE(n size_t) voidptr fn C.GC_REALLOC(ptr voidptr, n size_t) voidptr diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index 082b1713fd..3d853075b3 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -50,10 +50,11 @@ fn (mut g Gen) array_init(node ast.ArrayInit) { if node.exprs.len == 0 { elem_sym := g.table.get_type_symbol(node.elem_type) is_default_array := elem_sym.kind == .array && node.has_default + noscan := g.check_noscan(node.elem_type) if is_default_array { - g.write('__new_array_with_array_default(') + g.write('__new_array_with_array_default${noscan}(') } else { - g.write('__new_array_with_default(') + g.write('__new_array_with_default${noscan}(') } if node.has_len { g.expr(node.len_expr) @@ -145,7 +146,8 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) { g.expr(node.left) g.writeln(';') g.writeln('int ${tmp}_len = ${tmp}_orig.len;') - g.writeln('$ret_typ $tmp = __new_array(0, ${tmp}_len, sizeof($ret_elem_type));\n') + noscan := g.check_noscan(ret_info.elem_type) + g.writeln('$ret_typ $tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($ret_elem_type));\n') i := g.new_tmp_var() g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {') g.writeln('\t$inp_elem_type it = (($inp_elem_type*) ${tmp}_orig.data)[$i];') @@ -337,7 +339,8 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) { g.expr(node.left) g.writeln(';') g.writeln('int ${tmp}_len = ${tmp}_orig.len;') - g.writeln('$styp $tmp = __new_array(0, ${tmp}_len, sizeof($elem_type_str));\n') + noscan := g.check_noscan(info.elem_type) + g.writeln('$styp $tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($elem_type_str));\n') i := g.new_tmp_var() g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {') g.writeln('\t$elem_type_str it = (($elem_type_str*) ${tmp}_orig.data)[$i];') diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 51006b418a..72b6bd2f3c 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -427,7 +427,9 @@ pub fn (mut g Gen) init() { } g.comptime_defines.writeln('') } - if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm, .boehm_leak] { + if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm, + .boehm_leak, + ] { g.comptime_defines.writeln('#define _VGCBOEHM (1)') } if g.pref.is_debug || 'debug' in g.pref.compile_defines { @@ -5766,7 +5768,8 @@ fn (mut g Gen) type_default(typ_ ast.Type) string { if elem_type_str.starts_with('C__') { elem_type_str = elem_type_str[3..] } - init_str := '__new_array(0, 1, sizeof($elem_type_str))' + noscan := g.check_noscan(elem_typ) + init_str := '__new_array${noscan}(0, 1, sizeof($elem_type_str))' if typ.has_flag(.shared_f) { atyp := '__shared__Array_${g.table.get_type_symbol(elem_typ).cname}' return '($atyp*)__dup_shared_array(&($atyp){.val = $init_str}, sizeof($atyp))' @@ -6378,3 +6381,64 @@ fn (mut g Gen) trace(fbase string, message string) { println('> g.trace | ${fbase:-10s} | $message') } } + +// returns true if `t` includes any pointer(s) - during garbage collection heap regions +// that contain no pointers do not have to be scanned +pub fn (mut g Gen) contains_ptr(el_typ ast.Type) bool { + if el_typ.is_ptr() || el_typ.is_pointer() { + return true + } + typ := g.unwrap_generic(el_typ) + if typ.is_ptr() { + return true + } + sym := g.table.get_final_type_symbol(typ) + if sym.language != .v { + return true + } + match sym.kind { + .i8, .i16, .int, .i64, .byte, .u16, .u32, .u64, .f32, .f64, .char, .size_t, .rune, .bool, + .enum_ { + return false + } + .array_fixed { + info := sym.info as ast.ArrayFixed + return g.contains_ptr(info.elem_type) + } + .struct_ { + info := sym.info as ast.Struct + for embed in info.embeds { + if g.contains_ptr(embed) { + return true + } + } + for field in info.fields { + if g.contains_ptr(field.typ) { + return true + } + } + return false + } + .aggregate { + info := sym.info as ast.Aggregate + for atyp in info.types { + if g.contains_ptr(atyp) { + return true + } + } + return false + } + else { + return true + } + } +} + +fn (mut g Gen) check_noscan(elem_typ ast.Type) string { + if g.pref.gc_mode in [.boehm_full_opt, .boehm_incr_opt] { + if !g.contains_ptr(elem_typ) { + return '_noscan' + } + } + return '' +} diff --git a/vlib/v/gen/c/cmain.v b/vlib/v/gen/c/cmain.v index 9cfab64545..bc093104d0 100644 --- a/vlib/v/gen/c/cmain.v +++ b/vlib/v/gen/c/cmain.v @@ -70,13 +70,15 @@ fn (mut g Gen) gen_c_main_function_header() { fn (mut g Gen) gen_c_main_header() { g.gen_c_main_function_header() - if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm, .boehm_leak] { + if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm, + .boehm_leak, + ] { g.writeln('#if defined(_VGCBOEHM)') if g.pref.gc_mode == .boehm_leak { g.writeln('\tGC_set_find_leak(1);') } g.writeln('\tGC_INIT();') - if g.pref.gc_mode == .boehm_incr { + if g.pref.gc_mode in [.boehm_incr, .boehm_incr_opt] { g.writeln('\tGC_enable_incremental();') } g.writeln('#endif') @@ -164,13 +166,15 @@ pub fn (mut g Gen) gen_c_main_for_tests() { main_fn_start_pos := g.out.len g.writeln('') g.gen_c_main_function_header() - if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm, .boehm_leak] { + if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm, + .boehm_leak, + ] { g.writeln('#if defined(_VGCBOEHM)') if g.pref.gc_mode == .boehm_leak { g.writeln('\tGC_set_find_leak(1);') } g.writeln('\tGC_INIT();') - if g.pref.gc_mode == .boehm_incr { + if g.pref.gc_mode in [.boehm_incr, .boehm_incr_opt] { g.writeln('\tGC_enable_incremental();') } g.writeln('#endif') diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 21e67e8175..4677fc0902 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -416,7 +416,7 @@ fn (mut g Gen) call_expr(node ast.CallExpr) { g.inside_call = false } gen_keep_alive := node.is_keep_alive && node.return_type != ast.void_type - && g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm] + && g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm] gen_or := node.or_block.kind != .absent // && !g.is_autofree is_gen_or_and_assign_rhs := gen_or && !g.discard_or_result cur_line := if is_gen_or_and_assign_rhs || gen_keep_alive { // && !g.is_autofree { @@ -890,7 +890,8 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { if g.is_json_fn { g.write(json_obj) } else { - if node.is_keep_alive && g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm] { + if node.is_keep_alive + && g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm] { cur_line := g.go_before_stmt(0) tmp_cnt_save = g.keep_alive_call_pregen(node) g.write(cur_line) diff --git a/vlib/v/gen/c/json.v b/vlib/v/gen/c/json.v index 9adc9bd5f1..2f3ee7a8a4 100644 --- a/vlib/v/gen/c/json.v +++ b/vlib/v/gen/c/json.v @@ -222,11 +222,12 @@ fn (mut g Gen) decode_array(value_type ast.Type) string { $styp val = *($styp*)val2.data; ' } + noscan := g.check_noscan(value_type) return ' if(root && !cJSON_IsArray(root) && !cJSON_IsNull(root)) { return (Option_Array_$styp){.state = 2, .err = v_error(string_add(_SLIT("Json element is not an array: "), tos2((byteptr)cJSON_PrintUnformatted(root))))}; } - res = __new_array(0, 0, sizeof($styp)); + res = __new_array${noscan}(0, 0, sizeof($styp)); const cJSON *jsval = NULL; cJSON_ArrayForEach(jsval, root) { diff --git a/vlib/v/markused/markused.v b/vlib/v/markused/markused.v index 5d583ebb85..749b009483 100644 --- a/vlib/v/markused/markused.v +++ b/vlib/v/markused/markused.v @@ -100,6 +100,14 @@ pub fn mark_used(mut table ast.Table, pref &pref.Preferences, ast_files []ast.Fi 'os.init_os_args', 'os.init_os_args_wide', ] + if pref.gc_mode in [.boehm_full_opt, .boehm_incr_opt] { + all_fn_root_names << [ + '__new_array_noscan', + '__new_array_with_default_noscan', + '__new_array_with_array_default_noscan', + 'new_array_from_c_array_noscan', + ] + } for k, mut mfn in all_fns { mut method_receiver_typename := '' diff --git a/vlib/v/pref/pref.v b/vlib/v/pref/pref.v index 4e56cb19dd..98addd7776 100644 --- a/vlib/v/pref/pref.v +++ b/vlib/v/pref/pref.v @@ -21,6 +21,8 @@ pub enum GarbageCollectionMode { no_gc boehm_full // full garbage collection mode boehm_incr // incremental garbage colletion mode + boehm_full_opt // full garbage collection mode + boehm_incr_opt // incremental garbage colletion mode boehm // default Boehm-GC mode for architecture boehm_leak // leak detection mode (makes `gc_check_leaks()` work) } @@ -241,6 +243,18 @@ pub fn parse_args(known_external_commands []string, args []string) (&Preferences parse_define(mut res, 'gcboehm') parse_define(mut res, 'gcboehm_incr') } + 'boehm_full_opt' { + res.gc_mode = .boehm_full_opt + parse_define(mut res, 'gcboehm') + parse_define(mut res, 'gcboehm_full') + parse_define(mut res, 'gcboehm_opt') + } + 'boehm_incr_opt' { + res.gc_mode = .boehm_incr_opt + parse_define(mut res, 'gcboehm') + parse_define(mut res, 'gcboehm_incr') + parse_define(mut res, 'gcboehm_opt') + } 'boehm' { res.gc_mode = .boehm parse_define(mut res, 'gcboehm') @@ -251,7 +265,13 @@ pub fn parse_args(known_external_commands []string, args []string) (&Preferences parse_define(mut res, 'gcboehm_leak') } else { - eprintln('unknown garbage collection mode, only `-gc boehm`, `-gc boehm_incr`, `-gc boehm_full` and `-gc boehm_leak` are supported') + eprintln('unknown garbage collection mode `-gc $gc_mode`, supported modes are:`') + eprintln(' `-gc boehm` ............ default mode for the platform') + eprintln(' `-gc boehm_full` ....... classic full collection') + eprintln(' `-gc boehm_incr` ....... incremental collection') + eprintln(' `-gc boehm_full_opt` ... optimized classic full collection') + eprintln(' `-gc boehm_incr_opt` ... optimized incremental collection') + eprintln(' `-gc boehm_leak` ....... leak detection (for debugging)') exit(1) } } diff --git a/vlib/v/tests/bench/gcboehm/GC_Ryzen_3800X_Linux.pdf b/vlib/v/tests/bench/gcboehm/GC_Ryzen_3800X_Linux.pdf index e5d55d6121b1802e04a6450c66bcdf8838d452e7..b25c3e6d9208ecef3cdaafd7d3b73a1e7b56e35a 100644 GIT binary patch literal 19044 zcmce;WmqK3vamb2yL;pA?(PnQySuv&?l8E+AcMQRySuwP%rLlpu-0Dt?DL&-pL>5@ zimL30%*c#PvXbcRx0+NzM2wb^juo1;;iB>xngzfBursuT=HUU*%b3`jIhzAmKU7N4 z004kq%);8)#PK7wHgGl(F)^|;Hi72jgLZOuG%>J&cF*icm$qAHL;QC2OzlqjgE#d+ z8PzLF5tJ4YV3U=AQc%+7s%=~seNlhhbp@+O)F91E!wp&6IJnQlr#L@u&uMUd71bAt z8lio`uE#b$a%nq!Pk`Cdven+aY>zYuWk|xB9+sS*Y_S#}`Fi+##_T!>Nsh6UF?Kj$ z(8Q}eF~sZP@donfQs!LO#_!#+20f#Fq3|PpBc-Yd@O{Ge3f#}PnOti{o8WTzihgSA zz2@2bHty|)+hZ-PDUUVNhW(1pcT>Hz!Y1u@vVfWtOJzIZ2hroa^IBw=V^@-O2|kDK z%J&?6S2qHD+a|MGPVY{?wvD_j0(#&eJw0TxV6yk#+o|jKstHo)Fn0*Q7bjv1aosrj zpthbj6hx^VL`rGWJ!AQ1OGQakZ=$X^J+`R4RcQqg#f1W7dp$~S1xFSueP|mP$P9$& zAuZVZ#+xuMB1|Mr1*rC{Z1rdg7oJ4M%=^uTZ&u54UW^=%Oepjlm2x z6pa)qD|(B~l%almZ-5(K!yyYyONeNhc~PAU64?K!K~uO58m1v6*wHQxKe$U*gs3zO z;E1LI-?8y6mq9!KOM+~0fUYpmrg_CF6Rco$n6MJEAgWX;3DX*os73prkol^rdcBo8 zgWL_+4jqOABs5X5j9`*rEf(aynAI<4Q5TaU7V6zA%p^7~=p9ce{{kWa#n*XEV^`jw zS^Hoi@{&@4V^x7^#xjevwPKg-xhU%G2xa&(HH3Jk4j%Hkz(kp;k>NiKgmX^6YZ|j- zRtSfP$22jp_OeNUc=B$)5=PBtHqu!|EVVjr38vX{R}BB6H|vm4f{Fz<24K(HTM(k~ zQ{hh9R--l(`EAGcUGAx}KHo3t?F^9@!|~yn9ExXWOm6J*ZIfWaaYRW04V|d~WhB>% zgLyxDlx38)otSePUBYD@JV`QP+u9RrDg6k_IiwKx43ZssR^uV zYPZq0@NHh*2=uzQR~|0gc(cDJKp)xveGut3hd&6niW2MwzNocbyujoX*N6-4ehoY7 z2ENy=*PMp8E;Grp4$$^u4rg`YUjdn9DY^DQnJ{ zhTS4J%6Nd(14QzZSCziC>(v6uw8z-tg9_9DG>=UMT^;-;{h1oK_bmK1(3m>wK3wHF z!u9gTdF_BVbOr+?B(AV|R-4}F#x

1rc&2O2dUAAl9Sws6a}nSnx>VsjaE}-MIj~ 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

  • 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 diff --git a/vlib/v/tests/bench/gcboehm/GC_Ryzen_3800X_Linux.svg b/vlib/v/tests/bench/gcboehm/GC_Ryzen_3800X_Linux.svg new file mode 100644 index 0000000000..ab7fedabdd --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/GC_Ryzen_3800X_Linux.svg @@ -0,0 +1,10619 @@ + + + +Gnuplot +Produced by GNUPLOT 5.2 patchlevel 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + + 0 + + + + + 1x106 + + + + + 2x106 + + + + + 3x106 + + + + + 4x106 + + + + + 5x106 + + + + + + + + + Pause Time [ms] + + + + + Interval # + + + + + Boehm-GC: Pause Times - Classic vs. Optimized Modes + + + + + + + -gc boehm_full + + + + -gc boehm_incr_opt + + + + -gc boehm_full_opt + + + + + + + + + -gc boehm_full + + + -gc boehm_full + + + + + + -gc boehm_incr_opt + + + -gc boehm_incr_opt + + + + + + -gc boehm_full_opt + + + -gc boehm_full_opt + + + + + + + + + + + + + + + + + + diff --git a/vlib/v/tests/bench/gcboehm/GC_bench.plt b/vlib/v/tests/bench/gcboehm/GC_bench.plt index 0815a6309b..af99eaeec5 100644 --- a/vlib/v/tests/bench/gcboehm/GC_bench.plt +++ b/vlib/v/tests/bench/gcboehm/GC_bench.plt @@ -1,9 +1,17 @@ #!/usr/bin/gnuplot -persist -set title "Boehm-GC: Full vs. Incremental/Generational Mode" -set xlabel "Interval #" +set title "Boehm-GC: Pause Times - Classic vs. Optimized Modes" font ",18" +set xlabel "Interval #" +set xtics out nomirror +set xtic 1000000 +set grid noxtics ytics set ylabel "Pause Time [ms]" -set terminal pdfcairo transparent enhanced fontscale 0.5 size 5.00in, 3.00in +set terminal pdfcairo transparent enhanced fontscale 0.5 size 5.00in, 3.00in +set key box at 4810000,77 Left enhanced opaque samplen 3 height 0.5 set output "GC_bench.pdf" -plot "boehm_full.txt" title "full GC" w i, "boehm_incr.txt" title "incr/generational GC" w i +plot "boehm_full.txt" title "{/Monospace -gc boehm\\_full}" w i lt 1, "boehm_incr_opt.txt" title "{/Monospace -gc boehm\\_incr\\_opt}" w i lt 2, "boehm_full_opt.txt" title "{/Monospace -gc boehm\\_full\\_opt}" w i lt 7 +set output +set terminal svg size 900,600 dynamic enhanced +set output "GC_bench.svg" +replot set output # EOF diff --git a/vlib/v/tests/bench/gcboehm/GC_bench.v b/vlib/v/tests/bench/gcboehm/GC_bench.v index ac32b6211e..411b122392 100644 --- a/vlib/v/tests/bench/gcboehm/GC_bench.v +++ b/vlib/v/tests/bench/gcboehm/GC_bench.v @@ -1,32 +1,43 @@ +import os import time import rand import math -struct MemObj { +struct DataObj { mut: - nxt []&MemObj + data []f64 +} + +struct PtrObj { +mut: + nxt []&DataObj +} + +struct PtrPtrObj { +mut: + nxt []&PtrObj } const ( - log2n = 10 + log2n = 11 n = 1 << log2n n4 = f64(u64(1) << (4 * log2n)) ) fn waste_mem() { - mut objs := MemObj{ - nxt: []&MemObj{len: n} + mut objs := PtrPtrObj{ + nxt: []&PtrObj{len: n} } for { - sz := rand.int_in_range(10, 100000) - mut new_obj := &MemObj{ - nxt: []&MemObj{len: sz} + sz := rand.int_in_range(10, 1000) + mut new_obj := &PtrObj{ + nxt: []&DataObj{len: sz} } - sz2 := rand.int_in_range(10, 100000) - new_obj2 := &MemObj{ - nxt: []&MemObj{len: sz2} + sz2 := rand.int_in_range(10, 500000) + new_obj2 := &DataObj{ + data: []f64{len: sz2} } - idx2 := rand.int_in_range(0, sz / 2) + idx2 := rand.int_in_range(0, sz) new_obj.nxt[idx2] = new_obj2 // non-equally distributed random index idx := int(math.sqrt(math.sqrt(rand.f64n(n4)))) @@ -35,9 +46,17 @@ fn waste_mem() { } fn main() { + mut n_iterations := 5_000_000 + if os.args.len == 2 { + n_iterations = os.args[1].int() + } + if os.args.len > 2 || n_iterations <= 0 { + eprintln('usage:\n\t${os.args[0]} [num_iterations]') + exit(1) + } go waste_mem() mut last := time.sys_mono_now() - for _ in 0 .. 10_000_000 { + for _ in 0 .. n_iterations { now := time.sys_mono_now() interval := now - last println(f64(interval) / f64(time.millisecond)) diff --git a/vlib/v/tests/bench/gcboehm/GC_bench_full.plt b/vlib/v/tests/bench/gcboehm/GC_bench_full.plt new file mode 100644 index 0000000000..842084e7e4 --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/GC_bench_full.plt @@ -0,0 +1,9 @@ +#!/usr/bin/gnuplot -persist +set title "Boehm-GC: Optimized vs. non-Optimized (Full Mode)" +set xlabel "Interval #" +set ylabel "Pause Time [ms]" +set terminal pdfcairo transparent enhanced fontscale 0.5 size 5.00in, 3.00in +set output "GC_bench_full.pdf" +plot "boehm_full.txt" title "full GC" w i, "boehm_full_opt.txt" title "full GC (opt)" w i +set output +# EOF diff --git a/vlib/v/tests/bench/gcboehm/GC_bench_incr.plt b/vlib/v/tests/bench/gcboehm/GC_bench_incr.plt new file mode 100644 index 0000000000..7608fd435a --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/GC_bench_incr.plt @@ -0,0 +1,9 @@ +#!/usr/bin/gnuplot -persist +set title "Boehm-GC: Optimized vs. non-Optimized (Generational Mode)" +set xlabel "Interval #" +set ylabel "Pause Time [ms]" +set terminal pdfcairo transparent enhanced fontscale 0.5 size 5.00in, 3.00in +set output "GC_bench_incr.pdf" +plot "boehm_incr.txt" title "non-optimized GC" w i, "boehm_incr_opt.txt" title "optimized GC" w i +set output +# EOF diff --git a/vlib/v/tests/bench/gcboehm/GC_bench_non_opt.plt b/vlib/v/tests/bench/gcboehm/GC_bench_non_opt.plt new file mode 100644 index 0000000000..a841c3e7e4 --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/GC_bench_non_opt.plt @@ -0,0 +1,9 @@ +#!/usr/bin/gnuplot -persist +set title "Boehm-GC: Full vs. Generational Mode (non-opt)" +set xlabel "Interval #" +set ylabel "Pause Time [ms]" +set terminal pdfcairo transparent enhanced fontscale 0.5 size 5.00in, 3.00in +set output "GC_bench_non_opt.pdf" +plot "boehm_full.txt" title "full GC" w i, "boehm_incr.txt" title "incr/generational GC" w i +set output +# EOF diff --git a/vlib/v/tests/bench/gcboehm/GC_bench_opt.plt b/vlib/v/tests/bench/gcboehm/GC_bench_opt.plt new file mode 100644 index 0000000000..932d8fa362 --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/GC_bench_opt.plt @@ -0,0 +1,9 @@ +#!/usr/bin/gnuplot -persist +set title "Boehm-GC: Full vs. Generational Mode (optimized)" +set xlabel "Interval #" +set ylabel "Pause Time [ms]" +set terminal pdfcairo transparent enhanced fontscale 0.5 size 5.00in, 3.00in +set output "GC_bench_opt.pdf" +plot "boehm_full_opt.txt" title "full GC" w i, "boehm_incr_opt.txt" title "incr/generational GC" w i +set output +# EOF diff --git a/vlib/v/tests/bench/gcboehm/Makefile b/vlib/v/tests/bench/gcboehm/Makefile index 2437a73492..f91242c24e 100644 --- a/vlib/v/tests/bench/gcboehm/Makefile +++ b/vlib/v/tests/bench/gcboehm/Makefile @@ -1,9 +1,29 @@ .PHONY: all -all: GC_bench.pdf +all: GC_bench_non_opt.pdf GC_bench_full.pdf GC_bench_incr.pdf GC_bench_opt.pdf GC_bench.pdf Resources.pdf -GC_bench.pdf: boehm_full.txt boehm_incr.txt - gnuplot GC_bench.plt +GC_bench_non_opt.pdf: GC_bench_non_opt.plt boehm_full.txt boehm_incr.txt + gnuplot $< + @echo "$@ created" + +GC_bench_full.pdf: GC_bench_full.plt boehm_full.txt boehm_full_opt.txt + gnuplot $< + @echo "$@ created" + +GC_bench_incr.pdf: GC_bench_incr.plt boehm_incr.txt boehm_incr_opt.txt + gnuplot $< + @echo "$@ created" + +GC_bench_opt.pdf: GC_bench_opt.plt boehm_full_opt.txt boehm_incr_opt.txt + gnuplot $< + @echo "$@ created" + +GC_bench.pdf: GC_bench.plt boehm_full.txt boehm_incr_opt.txt + gnuplot $< + @echo "$@ created" + +Resources.pdf: Resources.plt resources.txt + gnuplot $< @echo "$@ created" boehm_full.txt: GC_bench_full @@ -16,11 +36,31 @@ boehm_incr.txt: GC_bench_incr sleep 1 ./$< > $@ +boehm_full_opt.txt: GC_bench_full_opt + sync + sleep 1 + ./$< > $@ + +boehm_incr_opt.txt: GC_bench_incr_opt + sync + sleep 1 + ./$< > $@ + GC_bench_full: GC_bench.v v -prod -gc boehm_full -o $@ $< GC_bench_incr: GC_bench.v v -prod -gc boehm_incr -o $@ $< +GC_bench_full_opt: GC_bench.v + v -prod -gc boehm_full_opt -o $@ $< + +GC_bench_incr_opt: GC_bench.v + v -prod -gc boehm_incr_opt -o $@ $< + clean: - rm -f boehm_full.txt boehm_incr.txt GC_bench.pdf GC_bench_full GC_bench_incr + rm -f boehm_full.txt boehm_incr.txt boehm_full_opt.txt boehm_incr_opt.txt \ + GC_bench_non_opt.pdf GC_bench_full.pdf GC_bench_incr.pdf \ + GC_bench_opt.pdf GC_bench.pdf Resources.pdf \ + GC_bench_full GC_bench_incr GC_bench_full_opt GC_bench_incr_opt \ + GC_bench.svg Resources.svg diff --git a/vlib/v/tests/bench/gcboehm/Resources.plt b/vlib/v/tests/bench/gcboehm/Resources.plt new file mode 100644 index 0000000000..00ba31463e --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/Resources.plt @@ -0,0 +1,45 @@ +#!/usr/local/bin/gnuplot -persist +set terminal pdfcairo transparent enhanced fontscale 0.5 size 8.00in, 4.50in +set output "Resources.pdf" +set multiplot layout 1,3 title "\nBoehm GC: Resource Requirements for \`GC\\_bench.v\` (2·10^8 Iterations)\n" font ",18" +set rmargin 9 +set grid noxtics ytics +set xtics border rotate by -45 +set key box Right samplen 1 spacing 1 height 0.5 opaque +set style data histogram +set style histogram clustered gap 1 title textcolor lt -1 +set style fill solid border -1 +# +set ylabel "Process Memory [GB]" +plot [-1:4] [0:9.36] "resources.txt" using 3:xtic(1) title "{/Monospace Memory Usage}" lt 2 +# +set lmargin at screen 0.39 +set ylabel "CPU Usage [% of 1 Core]" +plot [-1:4] [0:750] "resources.txt" using 5:xtic(1) title "{/Monospace CPU Usage}" lt 7 +# +set lmargin at screen 0.71 +set ylabel "Time [s]" +plot [-1:4] [0:210] "resources.txt" using 4:xtic(1) title "{/Monospace Time to Complete}" lt 3 +unset multiplot +set output +unset margin +set terminal svg size 900,530 dynamic enhanced +set output "Resources.svg" +set multiplot layout 1,3 title "\nBoehm GC: Resource Requirements for \`GC\\_bench.v\` (2·10^8 Iterations)\n" font ",18" +# +set rmargin at screen 0.27 +set ylabel "Process Memory [GB]" +plot [-1:4] [0:9.36] "resources.txt" using 3:xtic(1) title "{/Monospace Memory Usage}" lt 2 +# +set lmargin at screen 0.38 +set rmargin at screen 0.59 +set ylabel "CPU Usage [% of 1 Core]" +plot [-1:4] [0:750] "resources.txt" using 5:xtic(1) title "{/Monospace CPU Usage}" lt 7 +# +set lmargin at screen 0.71 +unset rmargin +set ylabel "Time [s]" +plot [-1:4] [0:210] "resources.txt" using 4:xtic(1) title "{/Monospace Time to Complete}" lt 3 +unset multiplot +set output +# EOF diff --git a/vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.pdf b/vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.pdf new file mode 100644 index 0000000000000000000000000000000000000000..edb00f23d0893330005ad110234d86c0c2e087ed GIT binary patch literal 18959 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�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 literal 0 HcmV?d00001 diff --git a/vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.svg b/vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.svg new file mode 100644 index 0000000000..e8bea14b0e --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/Resources_Ryzen_3800X_Linux.svg @@ -0,0 +1,613 @@ + + + +Gnuplot +Produced by GNUPLOT 5.2 patchlevel 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Boehm GC: Resource Requirements for `GC_bench.v` (2·108 Iterations) + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 7 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 9 + + + + + -gc boehm_full + + + + + -gc boehm_incr + + + + + -gc boehm_full_opt + + + + + -gc boehm_incr_opt + + + + + + + + + Process Memory [GB] + + + + + + + Memory Usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Memory Usage + + + Memory Usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 300 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 600 + + + + + + + + + + + + + 700 + + + + + -gc boehm_full + + + + + -gc boehm_incr + + + + + -gc boehm_full_opt + + + + + -gc boehm_incr_opt + + + + + + + + + CPU Usage [% of 1 Core] + + + + + + + CPU Usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU Usage + + + CPU Usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 150 + + + + + + + + + + + + + 200 + + + + + -gc boehm_full + + + + + -gc boehm_incr + + + + + -gc boehm_full_opt + + + + + -gc boehm_incr_opt + + + + + + + + + Time [s] + + + + + + + Time to Complete + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Time to Complete + + + Time to Complete + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vlib/v/tests/bench/gcboehm/resources.txt b/vlib/v/tests/bench/gcboehm/resources.txt new file mode 100644 index 0000000000..de951eb2cc --- /dev/null +++ b/vlib/v/tests/bench/gcboehm/resources.txt @@ -0,0 +1,6 @@ +# 200000000 iterations +# flags %MEM MEM[GB] TIME[s] %CPU +"-gc boehm\\_full" 19.7 6.17 132 680 +"-gc boehm\\_incr" 23.7 7.42 181 625 +"-gc boehm\\_full\\_opt" 14.0 4.38 100 204 +"-gc boehm\\_incr\\_opt" 14.4 4.51 166 186