From 8b21a6c55e034a41e093a97f93b96c749282acce Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Wed, 13 Apr 2022 00:25:53 -0400 Subject: [PATCH] Use hyperfine to benchmark, add builtin_fib as a comparison for how fast we could try to be --- fib_tests.sh | 77 +++++++++++++++++++++++++++++++++++++++--------- partial_eval.scm | 31 ++++++++++++++++++- shell.nix | 2 ++ 3 files changed, 95 insertions(+), 15 deletions(-) diff --git a/fib_tests.sh b/fib_tests.sh index 7bf3150..57b8a34 100755 --- a/fib_tests.sh +++ b/fib_tests.sh @@ -3,6 +3,54 @@ NUMBER=30 #NUMBER=25 +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp +mv csc_out.wasm fib_compiled.wasm +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp +mv csc_out.wasm fib_compiled_let.wasm + +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp no_compile +mv csc_out.wasm fib_interpreted.wasm +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp no_compile +mv csc_out.wasm fib_interpreted_let.wasm + +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib2.kp +mv csc_out.wasm fib_compiled_manual.wasm +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm builtin_fib.kp +mv csc_out.wasm builtin_fib.wasm + +pushd rust_fib +cargo build --target=wasm32-wasi +cargo build --release --target=wasm32-wasi +cargo build +cargo build --release +popd + +pushd clojure_fib +lein uberjar +popd + +pushd clojure_hi +lein uberjar +popd + +#clang-11 fib.c -o c_fib +#clang-11 fib_let.c -o c_fib_let + + +hyperfine --export-markdown table.md \ + 'echo '$NUMBER' | wasmtime ./fib_compiled.wasm' 'echo '$NUMBER' | wasmtime ./fib_compiled_let.wasm' \ + 'echo '$NUMBER' | wasmtime ./fib_interpreted.wasm' 'echo '$NUMBER' | wasmtime ./fib_interpreted_let.wasm' \ + 'echo '$NUMBER' | wasmtime ./builtin_fib.wasm' 'echo '$NUMBER' | wasmtime ./fib_compiled_manual.wasm' \ + 'echo '$NUMBER' | wasmtime ./rust_fib/target/wasm32-wasi/debug/rust_let.wasm' 'echo '$NUMBER' | wasmtime ./rust_fib/target/wasm32-wasi/release/rust_let.wasm' \ + 'echo '$NUMBER' | ./rust_fib/target/debug/rust_let' 'echo '$NUMBER' | ./rust_fib/target/release/rust_let' \ + "scheme --script ./fib.scm $NUMBER" "scheme --script ./fib_let.scm $NUMBER" \ + "python3 ./fib.py $NUMBER" "python3 ./fib_let.py $NUMBER" \ + "echo $NUMBER | java -jar ./clojure_fib/target/uberjar/clojure_fib-0.1.0-SNAPSHOT-standalone.jar" "echo $NUMBER | java -jar ./clojure_hi/target/uberjar/clojure_hi-0.1.0-SNAPSHOT-standalone.jar" + + #"./c_fib $NUMBER" "./c_fib_let $NUMBER" \ + +exit + #touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp && time perf record -k mono wasmtime --jitdump ./csc_out.wasm #exit @@ -15,6 +63,21 @@ echo "Compile Straight 2" #touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp && time echo $NUMBER | wasm3 ./csc_out.wasm touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib2.kp && time echo $NUMBER | wasmtime ./csc_out.wasm +echo "Compile Builtin" +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm builtin_fib.kp && time echo $NUMBER | wasmtime ./csc_out.wasm + +echo "Interpret Straight" +#touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp no_compile && time echo $NUMBER | wasm3 ./csc_out.wasm +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp no_compile && time echo $NUMBER | wasmtime ./csc_out.wasm + +echo "Compile Let" +#touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp && time echo $NUMBER | wasm3 ./csc_out.wasm +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp && time echo $NUMBER | wasmtime ./csc_out.wasm + +echo "Interpret Let" +#touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp no_compile && time echo $NUMBER | wasm3 ./csc_out.wasm +touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp no_compile && time echo $NUMBER | wasmtime ./csc_out.wasm + echo "Python" time python3 ./fib.py $NUMBER @@ -43,20 +106,6 @@ pushd clojure_fib lein uberjar && time echo $NUMBER | time java -jar target/uberjar/clojure_fib-0.1.0-SNAPSHOT-standalone.jar popd -exit - -echo "Interpret Straight" -#touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp no_compile && time echo $NUMBER | wasm3 ./csc_out.wasm -touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib.kp no_compile && time echo $NUMBER | wasmtime ./csc_out.wasm - -echo "Compile Let" -#touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp && time echo $NUMBER | wasm3 ./csc_out.wasm -touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp && time echo $NUMBER | wasmtime ./csc_out.wasm - -echo "Interpret Let" -#touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp no_compile && time echo $NUMBER | wasm3 ./csc_out.wasm -touch csc_out.wasm && rm csc_out.wasm && scheme --script ./partial_eval.scm fib_let.kp no_compile && time echo $NUMBER | wasmtime ./csc_out.wasm - echo "Chez Scheme" time scheme --script ./fib.scm $NUMBER diff --git a/partial_eval.scm b/partial_eval.scm index 4ed8262..a8502db 100644 --- a/partial_eval.scm +++ b/partial_eval.scm @@ -1064,6 +1064,7 @@ ;(needs_params_val_lambda 'prn prn) (give_up_eval_params 'log) (give_up_eval_params 'debug) + (give_up_eval_params 'builtin_fib) ; really do need to figure out mif we want to keep meta, and add it mif so ;(give_up_eval_params 'meta meta) ;(give_up_eval_params 'with-meta with-meta) @@ -2951,6 +2952,33 @@ drop_p_d )))) + + ((k_builtin_fib_helper func_idx funcs) (array func_idx (+ 1 func_idx) (concat funcs (func '$builtin_fib_helper '(param $n i64) '(result i64) + (_if '$eq0 '(result i64) + (i64.eq (i64.const 0) (local.get '$n)) + (then (i64.const 2)) + (else + (_if '$eq1 '(result i64) + (i64.eq (i64.const 2) (local.get '$n)) + (then (i64.const 2)) + (else + (i64.add (call '$builtin_fib_helper (i64.sub (local.get '$n) (i64.const 2))) (call '$builtin_fib_helper (i64.sub (local.get '$n) (i64.const 4)))) + ) + ) + ) + ) + )))) + + ((k_builtin_fib_loc k_builtin_fib_length datasi) (alloc_data "k_builtin_fib" datasi)) + (k_builtin_fib_msg_val (bor (<< k_builtin_fib_length 32) k_builtin_fib_loc #b011)) + ((k_builtin_fib func_idx funcs) (array func_idx (+ 1 func_idx) (concat funcs (func '$builtin_fib '(param $p i64) '(param $d i64) '(param $s i64) '(result i64) '(local $ptr i32) '(local $len i32) + (ensure_not_op_n_params_set_ptr_len i32.ne 1) + (type_assert 0 type_int k_builtin_fib_msg_val) + (call '$builtin_fib_helper (i64.load 0 (local.get '$ptr))) + drop_p_d + )))) + + ((k_concat_loc k_concat_length datasi) (alloc_data "k_concat" datasi)) (k_concat_msg_val (bor (<< k_concat_length 32) k_concat_loc #b011)) ((k_concat func_idx funcs) (array func_idx (+ 1 func_idx) (concat funcs (func '$concat '(param $p i64) '(param $d i64) '(param $s i64) '(result i64) '(local $ptr i32) '(local $len i32) '(local $size i32) '(local $i i32) '(local $it i64) '(local $new_ptr i32) '(local $inner_ptr i32) '(local $inner_size i32) '(local $new_ptr_traverse i32) '(local $is_str i32) @@ -4650,6 +4678,7 @@ ((= 'bnot (.prim_comb_sym c)) (array (bor (<< (- k_bnot dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) ((= '<< (.prim_comb_sym c)) (array (bor (<< (- k_ls dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) ((= '>> (.prim_comb_sym c)) (array (bor (<< (- k_rs dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) + ((= 'builtin_fib (.prim_comb_sym c)) (array (bor (<< (- k_builtin_fib dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) ((= 'array (.prim_comb_sym c)) (array (bor (<< (- k_array dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) ((= 'concat (.prim_comb_sym c)) (array (bor (<< (- k_concat dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) ((= 'slice (.prim_comb_sym c)) (array (bor (<< (- k_slice dyn_start) 35) (<< 0 5) (<< (.prim_comb_wrap_level c) 4) #b0001) nil nil ctx)) @@ -4817,7 +4846,7 @@ (true (error (str "Can't compile-inner impossible " c))) ))) - (_ (println "compiling partial evaled " (str_strip marked_code))) + ;(_ (println "compiling partial evaled " (str_strip marked_code))) ;(_ (true_print "compiling partial evaled " (true_str_strip marked_code))) ;(_ (true_print "compiling partial evaled ")) (memo empty_dict) diff --git a/shell.nix b/shell.nix index c4558a4..76b3530 100644 --- a/shell.nix +++ b/shell.nix @@ -19,5 +19,7 @@ mkShell { #(rustChannelOf { date = "2022-04-10"; channel = "nightly"; targets = [ "wasm32-wasi" ]; }).rust (latest.rustChannels.nightly.rust.override { targets = [ "wasm32-wasi" ]; }) leiningen + clang + hyperfine ]; }