all: gc: provide optimized mode (#9716)

pull/9730/head
Uwe Krüger 2021-04-14 00:40:26 +02:00 committed by GitHub
parent 8c95f07509
commit 10bf974cda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 11724 additions and 49 deletions

View File

@ -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

View File

@ -74,10 +74,12 @@ see also `v help build`.
Use and link an optional garbage collector. Only tThe BoehmDemersWeiser
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:

View File

@ -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
}

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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];')

View File

@ -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 ''
}

View File

@ -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')

View File

@ -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)

View File

@ -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)
{

View File

@ -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 := ''

View File

@ -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)
}
}

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -1,9 +1,17 @@
#!/usr/bin/gnuplot -persist
set title "Boehm-GC: Full vs. Incremental/Generational Mode"
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 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

View File

@ -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))

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,613 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg
viewBox="0 0 900 530"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>Gnuplot</title>
<desc>Produced by GNUPLOT 5.2 patchlevel 8 </desc>
<g id="gnuplot_canvas">
<rect x="0" y="0" width="900" height="530" fill="none"/>
<defs>
<circle id='gpDot' r='0.5' stroke-width='0.5' stroke='currentColor'/>
<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
<path id='gpPt13' stroke-width='0.222' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
</filter>
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
</filter>
</defs>
<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(450.0,23.9)" stroke="none" fill="black" font-family="Arial" font-size="18.00" text-anchor="middle">
<text></text>
</g>
<g transform="translate(450.0,50.9)" stroke="none" fill="black" font-family="Arial" font-size="18.00" text-anchor="middle">
<text><tspan font-family="Arial" >Boehm GC: Resource Requirements for `GC_bench.v` (2·10</tspan><tspan font-family="Arial" font-size="14.4" dy="-9.00px">8</tspan><tspan font-family="Arial" font-size="18.0" dy="9.00px"> Iterations)</tspan></text>
</g>
<g transform="translate(450.0,77.9)" stroke="none" fill="black" font-family="Arial" font-size="18.00" text-anchor="middle">
<text></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,406.4 L242.9,406.4 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,406.4 L64.3,406.4 M242.9,406.4 L233.9,406.4 '/> <g transform="translate(47.0,410.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 0</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,373.6 L242.9,373.6 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,373.6 L64.3,373.6 M242.9,373.6 L233.9,373.6 '/> <g transform="translate(47.0,377.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 1</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,340.7 L242.9,340.7 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,340.7 L64.3,340.7 M242.9,340.7 L233.9,340.7 '/> <g transform="translate(47.0,344.6)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 2</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,307.9 L242.9,307.9 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,307.9 L64.3,307.9 M242.9,307.9 L233.9,307.9 '/> <g transform="translate(47.0,311.8)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 3</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,275.1 L242.9,275.1 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,275.1 L64.3,275.1 M242.9,275.1 L233.9,275.1 '/> <g transform="translate(47.0,279.0)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 4</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,242.2 L242.9,242.2 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,242.2 L64.3,242.2 M242.9,242.2 L233.9,242.2 '/> <g transform="translate(47.0,246.1)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 5</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,209.4 L242.9,209.4 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,209.4 L64.3,209.4 M242.9,209.4 L233.9,209.4 '/> <g transform="translate(47.0,213.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 6</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,176.6 L242.9,176.6 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,176.6 L64.3,176.6 M242.9,176.6 L233.9,176.6 '/> <g transform="translate(47.0,180.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 7</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,143.8 L242.9,143.8 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,143.8 L64.3,143.8 M242.9,143.8 L233.9,143.8 '/> <g transform="translate(47.0,147.7)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 8</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M55.3,110.9 L101.1,110.9 M234.6,110.9 L242.9,110.9 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,110.9 L64.3,110.9 M242.9,110.9 L233.9,110.9 '/> <g transform="translate(47.0,114.8)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 9</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M92.8,406.4 L92.8,397.4 M92.8,99.1 L92.8,108.1 '/> <g transform="translate(90.0,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_full</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M130.3,406.4 L130.3,397.4 M130.3,99.1 L130.3,108.1 '/> <g transform="translate(127.5,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_incr</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M167.9,406.4 L167.9,397.4 M167.9,99.1 L167.9,108.1 '/> <g transform="translate(165.1,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_full_opt</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M205.4,406.4 L205.4,397.4 M205.4,99.1 L205.4,108.1 '/> <g transform="translate(202.6,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_incr_opt</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,99.1 L55.3,406.4 L242.9,406.4 L242.9,99.1 L55.3,99.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(19.0,252.8) rotate(270)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" >Process Memory [GB]</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M101.1,135.1 L101.1,108.1 L234.6,108.1 L234.6,135.1 L101.1,135.1 Z '/></g>
<g id="gnuplot_plot_1a" ><title>Memory Usage</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 0, 158, 115)' points = '83.4,406.4 102.3,406.4 102.3,203.7 83.4,203.7 '/>
</g>
<path stroke='black' d='M83.4,406.4 L83.4,203.8 L102.2,203.8 L102.2,406.4 L83.4,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 0, 158, 115)' points = '121.0,406.4 139.8,406.4 139.8,162.7 121.0,162.7 '/>
</g>
<path stroke='black' d='M121.0,406.4 L121.0,162.8 L139.7,162.8 L139.7,406.4 L121.0,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 0, 158, 115)' points = '158.5,406.4 177.3,406.4 177.3,262.5 158.5,262.5 '/>
</g>
<path stroke='black' d='M158.5,406.4 L158.5,262.6 L177.2,262.6 L177.2,406.4 L158.5,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 0, 158, 115)' points = '196.0,406.4 214.9,406.4 214.9,258.2 196.0,258.2 '/>
</g>
<path stroke='black' d='M196.0,406.4 L196.0,258.3 L214.8,258.3 L214.8,406.4 L196.0,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'white' points = '101.1,135.1 234.6,135.1 234.6,108.1 101.1,108.1 '/>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M101.1,135.1 L101.1,108.1 L234.6,108.1 L234.6,135.1 L101.1,135.1 Z '/></g>
<g id="gnuplot_plot_1a" ><title>Memory Usage</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(200.7,125.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Monospace" >Memory Usage</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 0, 158, 115)' points = '209.0,126.1 226.3,126.1 226.3,117.1 209.0,117.1 '/>
</g>
<path stroke='black' d='M209.0,126.1 L226.3,126.1 L226.3,117.1 L209.0,117.1 L209.0,126.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g fill="none" color="white" stroke="rgb( 0, 158, 115)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M55.3,99.1 L55.3,406.4 L242.9,406.4 L242.9,99.1 L55.3,99.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,406.4 L530.9,406.4 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,406.4 L351.0,406.4 M530.9,406.4 L521.9,406.4 '/> <g transform="translate(333.7,410.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 0</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,365.4 L530.9,365.4 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,365.4 L351.0,365.4 M530.9,365.4 L521.9,365.4 '/> <g transform="translate(333.7,369.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 100</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,324.5 L530.9,324.5 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,324.5 L351.0,324.5 M530.9,324.5 L521.9,324.5 '/> <g transform="translate(333.7,328.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 200</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,283.5 L530.9,283.5 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,283.5 L351.0,283.5 M530.9,283.5 L521.9,283.5 '/> <g transform="translate(333.7,287.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 300</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,242.5 L530.9,242.5 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,242.5 L351.0,242.5 M530.9,242.5 L521.9,242.5 '/> <g transform="translate(333.7,246.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 400</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,201.5 L530.9,201.5 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,201.5 L351.0,201.5 M530.9,201.5 L521.9,201.5 '/> <g transform="translate(333.7,205.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 500</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,160.6 L530.9,160.6 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,160.6 L351.0,160.6 M530.9,160.6 L521.9,160.6 '/> <g transform="translate(333.7,164.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 600</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M342.0,119.6 L414.0,119.6 M522.6,119.6 L530.9,119.6 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,119.6 L351.0,119.6 M530.9,119.6 L521.9,119.6 '/> <g transform="translate(333.7,123.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 700</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M379.8,406.4 L379.8,397.4 M379.8,99.1 L379.8,108.1 '/> <g transform="translate(377.0,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_full</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M417.6,406.4 L417.6,397.4 M417.6,99.1 L417.6,108.1 '/> <g transform="translate(414.8,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_incr</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M455.3,406.4 L455.3,397.4 M455.3,99.1 L455.3,108.1 '/> <g transform="translate(452.5,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_full_opt</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M493.1,406.4 L493.1,397.4 M493.1,99.1 L493.1,108.1 '/> <g transform="translate(490.3,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_incr_opt</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,99.1 L342.0,406.4 L530.9,406.4 L530.9,99.1 L342.0,99.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(289.1,252.8) rotate(270)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" >CPU Usage [% of 1 Core]</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M414.0,135.1 L414.0,108.1 L522.6,108.1 L522.6,135.1 L414.0,135.1 Z '/></g>
<g id="gnuplot_plot_1b" ><title>CPU Usage</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(229, 30, 16)' points = '370.3,406.4 389.3,406.4 389.3,127.7 370.3,127.7 '/>
</g>
<path stroke='black' d='M370.3,406.4 L370.3,127.8 L389.2,127.8 L389.2,406.4 L370.3,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(229, 30, 16)' points = '408.1,406.4 427.1,406.4 427.1,150.2 408.1,150.2 '/>
</g>
<path stroke='black' d='M408.1,406.4 L408.1,150.3 L427.0,150.3 L427.0,406.4 L408.1,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(229, 30, 16)' points = '445.9,406.4 464.9,406.4 464.9,322.7 445.9,322.7 '/>
</g>
<path stroke='black' d='M445.9,406.4 L445.9,322.8 L464.8,322.8 L464.8,406.4 L445.9,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(229, 30, 16)' points = '483.7,406.4 502.7,406.4 502.7,330.1 483.7,330.1 '/>
</g>
<path stroke='black' d='M483.7,406.4 L483.7,330.2 L502.6,330.2 L502.6,406.4 L483.7,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'white' points = '414.0,135.1 522.6,135.1 522.6,108.1 414.0,108.1 '/>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M414.0,135.1 L414.0,108.1 L522.6,108.1 L522.6,135.1 L414.0,135.1 Z '/></g>
<g id="gnuplot_plot_1b" ><title>CPU Usage</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(488.7,125.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Monospace" >CPU Usage</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(229, 30, 16)' points = '497.0,126.1 514.3,126.1 514.3,117.1 497.0,117.1 '/>
</g>
<path stroke='black' d='M497.0,126.1 L514.3,126.1 L514.3,117.1 L497.0,117.1 L497.0,126.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g fill="none" color="white" stroke="rgb(229, 30, 16)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M342.0,99.1 L342.0,406.4 L530.9,406.4 L530.9,99.1 L342.0,99.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M639.0,406.4 L835.0,406.4 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,406.4 L648.0,406.4 M835.0,406.4 L826.0,406.4 '/> <g transform="translate(630.7,410.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 0</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M639.0,333.2 L835.0,333.2 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,333.2 L648.0,333.2 M835.0,333.2 L826.0,333.2 '/> <g transform="translate(630.7,337.1)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 50</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M639.0,260.1 L835.0,260.1 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,260.1 L648.0,260.1 M835.0,260.1 L826.0,260.1 '/> <g transform="translate(630.7,264.0)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 100</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M639.0,186.9 L835.0,186.9 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,186.9 L648.0,186.9 M835.0,186.9 L826.0,186.9 '/> <g transform="translate(630.7,190.8)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 150</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M639.0,113.7 L660.0,113.7 M826.7,113.7 L835.0,113.7 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,113.7 L648.0,113.7 M835.0,113.7 L826.0,113.7 '/> <g transform="translate(630.7,117.6)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Arial" > 200</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M678.2,406.4 L678.2,397.4 M678.2,99.1 L678.2,108.1 '/> <g transform="translate(675.4,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_full</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M717.4,406.4 L717.4,397.4 M717.4,99.1 L717.4,108.1 '/> <g transform="translate(714.6,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_incr</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M756.6,406.4 L756.6,397.4 M756.6,99.1 L756.6,108.1 '/> <g transform="translate(753.8,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_full_opt</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M795.8,406.4 L795.8,397.4 M795.8,99.1 L795.8,108.1 '/> <g transform="translate(793.0,417.5) rotate(45)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="start">
<text><tspan font-family="Arial" >-gc boehm_incr_opt</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,99.1 L639.0,406.4 L835.0,406.4 L835.0,99.1 L639.0,99.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(586.1,252.8) rotate(270)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" >Time [s]</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M660.0,135.1 L660.0,108.1 L826.7,108.1 L826.7,135.1 L660.0,135.1 Z '/></g>
<g id="gnuplot_plot_1c" ><title>Time to Complete</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 86, 180, 233)' points = '668.4,406.4 688.1,406.4 688.1,213.1 668.4,213.1 '/>
</g>
<path stroke='black' d='M668.4,406.4 L668.4,213.2 L688.0,213.2 L688.0,406.4 L668.4,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 86, 180, 233)' points = '707.6,406.4 727.3,406.4 727.3,141.4 707.6,141.4 '/>
</g>
<path stroke='black' d='M707.6,406.4 L707.6,141.5 L727.2,141.5 L727.2,406.4 L707.6,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 86, 180, 233)' points = '746.8,406.4 766.5,406.4 766.5,260.0 746.8,260.0 '/>
</g>
<path stroke='black' d='M746.8,406.4 L746.8,260.1 L766.4,260.1 L766.4,406.4 L746.8,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 86, 180, 233)' points = '786.0,406.4 805.7,406.4 805.7,163.4 786.0,163.4 '/>
</g>
<path stroke='black' d='M786.0,406.4 L786.0,163.5 L805.6,163.5 L805.6,406.4 L786.0,406.4 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'white' points = '660.0,135.1 826.7,135.1 826.7,108.1 660.0,108.1 '/>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M660.0,135.1 L660.0,108.1 L826.7,108.1 L826.7,135.1 L660.0,135.1 Z '/></g>
<g id="gnuplot_plot_1c" ><title>Time to Complete</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(792.8,125.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end">
<text><tspan font-family="Monospace" >Time to Complete</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb( 86, 180, 233)' points = '801.1,126.1 818.4,126.1 818.4,117.1 801.1,117.1 '/>
</g>
<path stroke='black' d='M801.1,126.1 L818.4,126.1 L818.4,117.1 L801.1,117.1 L801.1,126.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g fill="none" color="white" stroke="rgb( 86, 180, 233)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M639.0,99.1 L639.0,406.4 L835.0,406.4 L835.0,99.1 L639.0,99.1 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -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