🎨 add memory usage calc

This commit is contained in:
ValKmjolnir 2025-02-05 19:43:02 +08:00
parent 09cd3027e9
commit 04e30b9c7f
4 changed files with 41 additions and 4 deletions

View File

@ -75,6 +75,7 @@ void execute(const nasal::cli::cli_config& config) {
// run // run
const auto start = clk::now(); const auto start = clk::now();
double gc_time_ms = 0.0; double gc_time_ms = 0.0;
double gc_total_memory = 0.0;
if (config.has(option::cli_debug_mode)) { if (config.has(option::cli_debug_mode)) {
auto debugger = std::make_unique<nasal::dbg>(); auto debugger = std::make_unique<nasal::dbg>();
debugger->run( debugger->run(
@ -85,6 +86,7 @@ void execute(const nasal::cli::cli_config& config) {
config.has(option::cli_profile_all) config.has(option::cli_profile_all)
); );
gc_time_ms = debugger->get_gc_time_ms(); gc_time_ms = debugger->get_gc_time_ms();
gc_total_memory = debugger->get_total_memory();
} else if (config.has(option::cli_show_execute_time) || } else if (config.has(option::cli_show_execute_time) ||
config.has(option::cli_detail_info) || config.has(option::cli_detail_info) ||
config.has(option::cli_limit_mode) || config.has(option::cli_limit_mode) ||
@ -94,6 +96,7 @@ void execute(const nasal::cli::cli_config& config) {
runtime->set_limit_mode_flag(config.has(option::cli_limit_mode)); runtime->set_limit_mode_flag(config.has(option::cli_limit_mode));
runtime->run(gen, ld, config.nasal_vm_args); runtime->run(gen, ld, config.nasal_vm_args);
gc_time_ms = runtime->get_gc_time_ms(); gc_time_ms = runtime->get_gc_time_ms();
gc_total_memory = runtime->get_total_memory();
} }
// get running time // get running time
@ -104,7 +107,8 @@ void execute(const nasal::cli::cli_config& config) {
std::clog << "process exited after "; std::clog << "process exited after ";
std::clog << execute_time_sec << "s, gc time: "; std::clog << execute_time_sec << "s, gc time: ";
std::clog << gc_time_sec << "s ("; std::clog << gc_time_sec << "s (";
std::clog << gc_time_sec / execute_time_sec * 100.0 << "%)\n\n"; std::clog << gc_time_sec / execute_time_sec * 100.0 << "%), ";
std::clog << "memory usage: " << gc_total_memory << "MB\n\n";
} }
} }

View File

@ -202,9 +202,28 @@ void gc::extend(const vm_type type) {
memory.push_back(tmp); memory.push_back(tmp);
unused[index].push_back(tmp); unused[index].push_back(tmp);
} }
switch(type) {
case vm_type::vm_str:
total_memory_usage += incr[index] * sizeof(std::string); break;
case vm_type::vm_vec:
total_memory_usage += incr[index] * sizeof(nas_vec); break;
case vm_type::vm_hash:
total_memory_usage += incr[index] * sizeof(nas_hash); break;
case vm_type::vm_func:
total_memory_usage += incr[index] * sizeof(nas_func); break;
case vm_type::vm_upval:
total_memory_usage += incr[index] * sizeof(nas_upval); break;
case vm_type::vm_ghost:
total_memory_usage += incr[index] * sizeof(nas_ghost); break;
case vm_type::vm_co:
total_memory_usage += incr[index] * sizeof(nas_co); break;
case vm_type::vm_map:
total_memory_usage += incr[index] * sizeof(nas_map); break;
default: break;
}
// if incr[index] = 1, this will always be 1 // if incr[index] = 1, this will always be 1
incr[index] = incr[index]+incr[index]/2; incr[index] = incr[index] + incr[index]/2;
} }
void gc::init(const std::vector<std::string>& constant_strings, void gc::init(const std::vector<std::string>& constant_strings,
@ -220,7 +239,7 @@ void gc::init(const std::vector<std::string>& constant_strings,
// init constant strings // init constant strings
strs.resize(constant_strings.size()); strs.resize(constant_strings.size());
for(u64 i = 0; i<strs.size(); ++i) { for (u64 i = 0; i < strs.size(); ++i) {
// incremental initialization, avoid memory leak in repl mode // incremental initialization, avoid memory leak in repl mode
if (strs[i].is_str() && strs[i].str()==constant_strings[i]) { if (strs[i].is_str() && strs[i].str()==constant_strings[i]) {
continue; continue;
@ -228,11 +247,13 @@ void gc::init(const std::vector<std::string>& constant_strings,
strs[i] = var::gcobj(new nas_val(vm_type::vm_str)); strs[i] = var::gcobj(new nas_val(vm_type::vm_str));
strs[i].val.gcobj->immutable = 1; strs[i].val.gcobj->immutable = 1;
strs[i].str() = constant_strings[i]; strs[i].str() = constant_strings[i];
total_memory_usage += strs[i].str().size();
total_memory_usage += sizeof(std::string);
} }
// record arguments // record arguments
env_argv.resize(argv.size()); env_argv.resize(argv.size());
for(u64 i = 0; i<argv.size(); ++i) { for (u64 i = 0; i < argv.size(); ++i) {
// incremental initialization, avoid memory leak in repl mode // incremental initialization, avoid memory leak in repl mode
if (env_argv[i].is_str() && env_argv[i].str()==argv[i]) { if (env_argv[i].is_str() && env_argv[i].str()==argv[i]) {
continue; continue;
@ -240,6 +261,8 @@ void gc::init(const std::vector<std::string>& constant_strings,
env_argv[i] = var::gcobj(new nas_val(vm_type::vm_str)); env_argv[i] = var::gcobj(new nas_val(vm_type::vm_str));
env_argv[i].val.gcobj->immutable = 1; env_argv[i].val.gcobj->immutable = 1;
env_argv[i].str() = argv[i]; env_argv[i].str() = argv[i];
total_memory_usage += env_argv[i].str().size();
total_memory_usage += sizeof(std::string);
} }
} }

View File

@ -52,6 +52,8 @@ struct gc {
16, // vm_co 16, // vm_co
2, // vm_map 2, // vm_map
}; };
// total memory usage, not very accurate
u64 total_memory_usage = 0;
/* values for analysis */ /* values for analysis */
u64 size[gc_type_size]; u64 size[gc_type_size];
@ -100,6 +102,10 @@ public:
return worktime * 1.0 / den * 1000.0; return worktime * 1.0 / den * 1000.0;
} }
double get_total_memory() const {
return total_memory_usage * 1.0 / 1024.0 / 1024.0;
}
public: public:
var newstr(char c) { var newstr(char c) {
var s = alloc(vm_type::vm_str); var s = alloc(vm_type::vm_str);

View File

@ -325,6 +325,10 @@ public:
return ngc.get_gc_time_ms(); return ngc.get_gc_time_ms();
} }
auto get_total_memory() const {
return ngc.get_total_memory();
}
void set_interrupt_ptr(std::atomic<bool>* p) { void set_interrupt_ptr(std::atomic<bool>* p) {
interrupt_ptr = p; interrupt_ptr = p;
} }