From eab84d5c0d148d042d3b5c01ab824b6306427837 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Mon, 10 Jul 2023 20:34:21 +0800 Subject: [PATCH] :zap: optimize gc --- README.md | 2 +- src/main.cpp | 2 +- src/nasal_gc.cpp | 119 ++++++++++++++++++++++++++++++++--------------- src/nasal_gc.h | 3 +- 4 files changed, 86 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index e151aff..a091ade 100644 --- a/README.md +++ b/README.md @@ -762,7 +762,7 @@ If get this, Congratulations! This interpreter uses more strict syntax to make sure it is easier for you to program and debug. And flightgear's nasal interpreter also has the same rule. -So do not use varibale without using `var` to declare it. +So do not use variable without using `var` to declare it. In Andy's interpreter: diff --git a/src/main.cpp b/src/main.cpp index 7d9b8fa..d20d64c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -145,7 +145,7 @@ void execute( // get running time if (cmd&VM_TIME) { f64 tm = (clk::now()-start).count()*1.0/den; - std::clog << "process exited after " << tm << "s.\n\n"; + std::clog << " process exited after " << tm << "s.\n\n"; } } diff --git a/src/nasal_gc.cpp b/src/nasal_gc.cpp index 8cccc55..bf34a5e 100644 --- a/src/nasal_gc.cpp +++ b/src/nasal_gc.cpp @@ -337,6 +337,23 @@ nas_map& var::map() { return *val.gcobj->ptr.map; } +void gc::do_mark_sweep() { + using clk = std::chrono::high_resolution_clock; + auto begin = clk::now(); + mark(); + auto mark_end = clk::now(); + sweep(); + auto sweep_end = clk::now(); + + auto total_time = (sweep_end-begin).count(); + auto mark_time = (mark_end-begin).count(); + auto sweep_time = (sweep_end-mark_end).count(); + worktime += total_time; + max_time = max_time bfs; mark_context(bfs); @@ -389,13 +406,17 @@ void gc::mark_var(std::vector& bfs_queue, var& value) { void gc::mark_vec(std::vector& bfs_queue, nas_vec& vec) { for(auto& i : vec.elems) { - bfs_queue.push_back(i); + if (i.type>vm_num) { + bfs_queue.push_back(i); + } } } void gc::mark_hash(std::vector& bfs_queue, nas_hash& hash) { for(auto& i : hash.elems) { - bfs_queue.push_back(i.second); + if (i.second.type>vm_num) { + bfs_queue.push_back(i.second); + } } } @@ -502,24 +523,39 @@ void gc::clear() { env_argv.clear(); } -void gc::info() { +void gc::info() const { + using std::left; using std::setw; using std::setfill; + + const char* used_table_name[] = { + "object type", "gc count", "alloc count", "memory size", + "detail", "time spend", "gc time", "avg time", "max gc", + "max mark", "max sweep", nullptr + }; const char* name[] = { - "string ", - "vector ", - "hashmap ", - "function ", - "upvalue ", - "object ", + "string", + "vector", + "hashmap", + "function", + "upvalue", + "object", "coroutine", - "mapper " + "mapper", + nullptr }; - usize indent = 0; - for(u8 i = 0; i&); void mark_var(std::vector&, var&); @@ -398,7 +399,7 @@ public: void extend(u8); void init(const std::vector&, const std::vector&); void clear(); - void info(); + void info() const; var alloc(const u8); void ctxchg(nas_co&); void ctxreserve();