From cdf7b92a8e2fe20c1068fe0738ce9420d7d70318 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sat, 19 Jun 2021 00:32:10 +0800 Subject: [PATCH] add statistical information --- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++----- lib.nas | 17 ++++++------ nasal_builtin.h | 18 ++++++------- nasal_codegen.h | 46 +++++++++++++------------------- stl/lib.nas | 17 ++++++------ 5 files changed, 109 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 2ce004c..fa21030 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,55 @@ f(1024,2048); 0x00000011: nop 0x00000000 ``` +## Test data + +### version 6.5 gc(i5-8250U windows10) + +running time and gc time: + +|file|call|total time|gc time| +|:----|:----|:----|:----| +|pi.nas|12000049|0.593s|0.222s| +|fib.nas|10573747|2.838s|0.187s| +|bp.nas|4419829|1.99s|0.18s| +|bigloop.nas|4000000|0.419s|0.039s| +|mandelbrot.nas|1044630|0.433s|0.041s| +|life.nas|817112|8.557s|0.199s| +|ascii-art.nas|45612|0.48s|0.027s| +|calc.nas|8089|0.068s|0.006s| +|quick_sort.nas|2768|0.107s|0s| +|bfs.nas|2471|1.763s|0.003s| + +operands calling frequency: + +|file|1st called op|2nd called op|3rd called op|4th called op|5th called op| +|:----|:----|:----|:----|:----|:----| +|pi.nas|callg|pop|mcallg|pnum|pone| +|fib.nas|calll|pnum|callg|less|jf| +|bp.nas|calll|callg|pop|callv|addeq| +|bigloop.nas|pnum|less|jf|callg|pone| +|mandelbrot.nas|callg|mult|loadg|pnum|pop| +|life.nas|calll|callv|pnum|jf|callg| +|ascii-art.nas|calll|pop|mcalll|callg|callb| +|calc.nas|calll|pop|pstr|mcalll|jmp| +|quick_sort.nas|calll|pop|jt|jf|less| +|bfs.nas|calll|pop|callv|mcalll|jf| + +operands calling total times: + +|file|1st called time|2nd called time|3rd called time|4th called time|5th called time| +|:----|:----|:----|:----|:----|:----| +|pi.nas|6000004|6000003|6000000|4000005|4000002| +|fib.nas|17622792|10573704|7049218|7049155|7049155| +|bp.nas|7081480|4227268|2764676|2617112|2065441| +|bigloop.nas|4000001|4000001|4000001|4000001|4000000| +|mandelbrot.nas|1519632|563856|290641|286795|284844| +|life.nas|2114371|974244|536413|534794|489743| +|ascii-art.nas|37906|22736|22402|18315|18292| +|calc.nas|191|124|109|99|87| +|quick_sort.nas|16226|5561|4144|3524|2833| +|bfs.nas|24707|16297|14606|14269|8672| + ## How to Use Nasal to Program ### basic value type @@ -496,17 +545,26 @@ struct FUNC_TABLE nasal_val* (*func)(std::vector&,nasal_gc&); } builtin_func[]= { - {"__builtin_std_cout",builtin_print}, - {"", NULL } + {"__builtin_print",builtin_print}, + {nullptr, nullptr } }; ``` -At last,warp the '__builtin_std_cout' in a nasal file: +At last,warp the '__builtin_print' in a nasal file: ```javascript -var print=func(elements...) +var print=func(elems...) { - return __builtin_std_cout(elements); + return __builtin_print(elems); +}; +``` + +In fact the arguments that '__builtin_print' uses is not necessary,So writting it like this is also right: + +```javascript +var print=func(elems...) +{ + return __builtin_print; }; ``` @@ -525,7 +583,7 @@ The value got before will be collected,but stil in use in this builtin function, So use builtin_alloc in builtin functions like this: ```C++ -nasal_val* builtin_getkeys(std::vector& local_scope,nasal_gc& gc) +nasal_val* builtin_keys(std::vector& local_scope,nasal_gc& gc) { nasal_val* hash_addr=local_scope[1]; if(hash_addr->type!=vm_hash) diff --git a/lib.nas b/lib.nas index 8de85cc..45f6bf5 100644 --- a/lib.nas +++ b/lib.nas @@ -4,20 +4,21 @@ var import=func(filename) } var print=func(elems...) { - return __builtin_std_cout(elems); + return __builtin_print(elems); }; var println=func(elems...) { - __builtin_std_cout(elems); - return print('\n'); + __builtin_print(elems); + elems=['\n']; + return __builtin_print(elems); } var append=func(vec,elems...) { - return __builtin_push_back(vec,elems); + return __builtin_append(vec,elems); } var setsize=func(vec,size) { - return __builtin_set_size(vec,size); + return __builtin_setsize(vec,size); } var system=func(str) { @@ -41,7 +42,7 @@ var rand=func(seed=nil) } var id=func(object) { - return __builtin_get_id(object); + return __builtin_id(object); } var int=func(val) { @@ -53,7 +54,7 @@ var num=func(val) } var pop=func(vec) { - return __builtin_pop_back(vec); + return __builtin_pop(vec); } var str=func(num) { @@ -73,7 +74,7 @@ var delete=func(hash,key) } var keys=func(hash) { - return __builtin_get_keys(hash); + return __builtin_keys(hash); } var time=func(begin_time) { diff --git a/nasal_builtin.h b/nasal_builtin.h index 882d7e2..d65583f 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -44,7 +44,7 @@ nasal_val* builtin_atan2(std::vector&,nasal_gc&); nasal_val* builtin_time(std::vector&,nasal_gc&); nasal_val* builtin_contains(std::vector&,nasal_gc&); nasal_val* builtin_delete(std::vector&,nasal_gc&); -nasal_val* builtin_getkeys(std::vector&,nasal_gc&); +nasal_val* builtin_keys(std::vector&,nasal_gc&); nasal_val* builtin_import(std::vector&,nasal_gc&); nasal_val* builtin_die(std::vector&,nasal_gc&); nasal_val* builtin_type(std::vector&,nasal_gc&); @@ -69,9 +69,9 @@ struct FUNC_TABLE nasal_val* (*func)(std::vector&,nasal_gc&); } builtin_func[]= { - {"__builtin_std_cout", builtin_print }, - {"__builtin_push_back",builtin_append }, - {"__builtin_set_size", builtin_setsize }, + {"__builtin_print", builtin_print }, + {"__builtin_append", builtin_append }, + {"__builtin_setsize", builtin_setsize }, {"__builtin_system", builtin_system }, {"__builtin_input", builtin_input }, {"__builtin_sleep", builtin_sleep }, @@ -79,10 +79,10 @@ struct FUNC_TABLE {"__builtin_fout", builtin_fout }, {"__builtin_split", builtin_split }, {"__builtin_rand", builtin_rand }, - {"__builtin_get_id", builtin_id }, + {"__builtin_id", builtin_id }, {"__builtin_int", builtin_int }, {"__builtin_num", builtin_num }, - {"__builtin_pop_back", builtin_pop }, + {"__builtin_pop", builtin_pop }, {"__builtin_str", builtin_str }, {"__builtin_size", builtin_size }, {"__builtin_xor", builtin_xor }, @@ -100,7 +100,7 @@ struct FUNC_TABLE {"__builtin_time", builtin_time }, {"__builtin_contains", builtin_contains}, {"__builtin_delete", builtin_delete }, - {"__builtin_get_keys", builtin_getkeys }, + {"__builtin_keys", builtin_keys }, {"__builtin_import", builtin_import }, {"__builtin_die", builtin_die }, {"__builtin_type", builtin_type }, @@ -110,7 +110,7 @@ struct FUNC_TABLE {"__builtin_right", builtin_right }, {"__builtin_cmp", builtin_cmp }, {"__builtin_chr", builtin_chr }, - {"", nullptr } + {nullptr, nullptr } }; nasal_val* builtin_print(std::vector& local_scope,nasal_gc& gc) @@ -648,7 +648,7 @@ nasal_val* builtin_delete(std::vector& local_scope,nasal_gc& gc) hash_addr->ptr.hash->elems.erase(*key_addr->ptr.str); return gc.nil_addr; } -nasal_val* builtin_getkeys(std::vector& local_scope,nasal_gc& gc) +nasal_val* builtin_keys(std::vector& local_scope,nasal_gc& gc) { nasal_val* hash_addr=local_scope[1]; if(hash_addr->type!=vm_hash) diff --git a/nasal_codegen.h b/nasal_codegen.h index eb66dd5..d17193e 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -273,8 +273,7 @@ void nasal_codegen::add_sym(std::string& name) int nasal_codegen::local_find(std::string& name) { - int index=-1; - int cnt=0; + int index=-1,cnt=0; for(auto& i:local) { for(int j=0;j=0) { @@ -564,10 +570,7 @@ void nasal_codegen::single_def(nasal_ast& ast) std::string& str=ast.get_children()[0].get_str(); add_sym(str); calc_gen(ast.get_children()[1]); - if(local.empty()) - gen(op_loadg,global_find(str)); - else - gen(op_loadl,local_find(str)); + local.empty()?gen(op_loadg,global_find(str)):gen(op_loadl,local_find(str)); return; } void nasal_codegen::multi_def(nasal_ast& ast) @@ -582,10 +585,7 @@ void nasal_codegen::multi_def(nasal_ast& ast) calc_gen(vals[i]); std::string& str=ids[i].get_str(); add_sym(str); - if(local.empty()) - gen(op_loadg,global_find(str)); - else - gen(op_loadl,local_find(str)); + local.empty()?gen(op_loadg,global_find(str)):gen(op_loadl,local_find(str)); } } else @@ -596,10 +596,7 @@ void nasal_codegen::multi_def(nasal_ast& ast) gen(op_callvi,i); std::string& str=ids[i].get_str(); add_sym(str); - if(local.empty()) - gen(op_loadg,global_find(str)); - else - gen(op_loadl,local_find(str)); + local.empty()?gen(op_loadg,global_find(str)):gen(op_loadl,local_find(str)); } gen(op_pop,0); } @@ -714,7 +711,6 @@ void nasal_codegen::while_gen(nasal_ast& ast) void nasal_codegen::for_gen(nasal_ast& ast) { - opcode op; switch(ast.get_children()[0].get_type()) { case ast_null:break; @@ -788,10 +784,7 @@ void nasal_codegen::forindex_gen(nasal_ast& ast) { std::string& str=ast.get_children()[0].get_children()[0].get_str(); add_sym(str); - if(local.empty()) - gen(op_loadg,global_find(str)); - else - gen(op_loadl,local_find(str)); + local.empty()?gen(op_loadg,global_find(str)):gen(op_loadl,local_find(str)); } else { @@ -818,10 +811,7 @@ void nasal_codegen::foreach_gen(nasal_ast& ast) { std::string& str=ast.get_children()[0].get_children()[0].get_str(); add_sym(str); - if(local.empty()) - gen(op_loadg,global_find(str)); - else - gen(op_loadl,local_find(str)); + local.empty()?gen(op_loadg,global_find(str)):gen(op_loadl,local_find(str)); } else { diff --git a/stl/lib.nas b/stl/lib.nas index 8de85cc..45f6bf5 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -4,20 +4,21 @@ var import=func(filename) } var print=func(elems...) { - return __builtin_std_cout(elems); + return __builtin_print(elems); }; var println=func(elems...) { - __builtin_std_cout(elems); - return print('\n'); + __builtin_print(elems); + elems=['\n']; + return __builtin_print(elems); } var append=func(vec,elems...) { - return __builtin_push_back(vec,elems); + return __builtin_append(vec,elems); } var setsize=func(vec,size) { - return __builtin_set_size(vec,size); + return __builtin_setsize(vec,size); } var system=func(str) { @@ -41,7 +42,7 @@ var rand=func(seed=nil) } var id=func(object) { - return __builtin_get_id(object); + return __builtin_id(object); } var int=func(val) { @@ -53,7 +54,7 @@ var num=func(val) } var pop=func(vec) { - return __builtin_pop_back(vec); + return __builtin_pop(vec); } var str=func(num) { @@ -73,7 +74,7 @@ var delete=func(hash,key) } var keys=func(hash) { - return __builtin_get_keys(hash); + return __builtin_keys(hash); } var time=func(begin_time) {