Add inlining of add and subtract, and now might be beating Python, though not by a statistically significant amount with the number of tests. Fib is still allocating 4 million times or so, which is weird, since +&- should have been the last calls to do so. Time to track that down

This commit is contained in:
Nathan Braswell
2022-04-20 23:47:36 -04:00
parent ec9f8d9d10
commit 0cb52eb0b4
3 changed files with 52 additions and 36 deletions

View File

@@ -25,34 +25,36 @@ cargo build
cargo build --release cargo build --release
popd popd
pushd rust_let #pushd rust_let
cargo build --target=wasm32-wasi #cargo build --target=wasm32-wasi
cargo build --release --target=wasm32-wasi #cargo build --release --target=wasm32-wasi
cargo build #cargo build
cargo build --release #cargo build --release
popd #popd
#
pushd clojure_fib #pushd clojure_fib
lein uberjar #lein uberjar
popd #popd
#
pushd clojure_hi #pushd clojure_hi
lein uberjar #lein uberjar
popd #popd
#clang-11 fib.c -o c_fib #clang-11 fib.c -o c_fib
#clang-11 fib_let.c -o c_fib_let #clang-11 fib_let.c -o c_fib_let
hyperfine --export-markdown table.md \ hyperfine --warmup 2 --export-markdown table.md \
'echo '$NUMBER' | wasmtime ./fib_compiled.wasm' 'echo '$NUMBER' | wasmtime ./fib_compiled_let.wasm' \ '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 ./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" \ "scheme --script ./fib.scm $NUMBER" "scheme --script ./fib_let.scm $NUMBER" \
"python3 ./fib.py $NUMBER" "python3 ./fib_let.py $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" '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' | 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' \
#'echo '$NUMBER' | wasmtime ./fib_interpreted.wasm' 'echo '$NUMBER' | wasmtime ./fib_interpreted_let.wasm' \
#"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" \ #"./c_fib $NUMBER" "./c_fib_let $NUMBER" \

View File

@@ -4566,6 +4566,20 @@
;; Test for the function being a constant to inline ;; Test for the function being a constant to inline
;; Namely, vcond (also veval!) ;; Namely, vcond (also veval!)
(single_num_type_check (lambda (code) (concat (local.set '$type_check_tmp code)
(_if '$not_num
(i64.ne (i64.const 0) (i64.and (i64.const 1) (local.get '$type_check_tmp)))
(then (unreachable))
)
(local.get '$type_check_tmp))))
(gen_numeric_impl (lambda (operation)
(dlet (((param_codes err ctx) (compile_params false ctx params)))
(mif err (array nil nil (str err " from function params in call to comb " (str_strip c)) ctx)
(array nil (foldl (lambda (running_code val_code) (operation running_code
(single_num_type_check val_code)))
(single_num_type_check (idx param_codes 0))
(slice param_codes 1 -1)) nil ctx)))
))
) (cond ) (cond
((and (prim_comb? func_value) (= (.prim_comb_sym func_value) 'veval)) (dlet ( ((and (prim_comb? func_value) (= (.prim_comb_sym func_value) 'veval)) (dlet (
@@ -4601,6 +4615,12 @@
((= i (- (len codes) 1)) (error "compiling bad length comb")) ((= i (- (len codes) 1)) (error "compiling bad length comb"))
(true (unreachable)) (true (unreachable))
)) param_codes 0) err ctx)))) )) param_codes 0) err ctx))))
((and (prim_comb? func_value) (= (.prim_comb_sym func_value) '+)) (gen_numeric_impl i64.add))
((and (prim_comb? func_value) (= (.prim_comb_sym func_value) '-)) (gen_numeric_impl i64.sub))
(true (dlet ( (true (dlet (
((param_codes first_params_err ctx) (compile_params false ctx params)) ((param_codes first_params_err ctx) (compile_params false ctx params))
((func_val func_code func_err ctx) (compile-inner ctx func_value false inside_veval s_env_access_code)) ((func_val func_code func_err ctx) (compile-inner ctx func_value false inside_veval s_env_access_code))
@@ -4925,7 +4945,7 @@
(call '$drop (local.get '$d_env))) (call '$drop (local.get '$d_env)))
(local.get '$outer_s_env)) (local.get '$outer_s_env))
)) ))
(our_func (apply func (concat (array '$userfunc) parameter_symbols (array '(param $outer_s_env i64) '(result i64) '(local $param_ptr i32) '(local $s_env i64) '(local $tmp_ptr i32) '(local $tmp i64) (our_func (apply func (concat (array '$userfunc) parameter_symbols (array '(param $outer_s_env i64) '(result i64) '(local $param_ptr i32) '(local $s_env i64) '(local $tmp_ptr i32) '(local $tmp i64) '(local $type_check_tmp i64)
(local.set '$s_env (i64.const nil_val)) (local.set '$s_env (i64.const nil_val))

View File

@@ -1,18 +1,12 @@
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | | Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
| `echo 30 \| wasmtime ./fib_compiled.wasm` | 500.3 ± 3.0 | 495.3 | 503.8 | 111.77 ± 14.02 | | `echo 30 \| wasmtime ./fib_compiled.wasm` | 281.3 ± 4.3 | 274.3 | 289.5 | 24.35 ± 1.25 |
| `echo 30 \| wasmtime ./fib_compiled_let.wasm` | 816.4 ± 3.4 | 812.8 | 821.6 | 182.39 ± 22.86 | | `echo 30 \| wasmtime ./fib_compiled_let.wasm` | 716.4 ± 52.4 | 692.3 | 862.6 | 62.00 ± 5.46 |
| `echo 30 \| wasmtime ./fib_interpreted.wasm` | 11818.0 ± 64.9 | 11751.4 | 11983.8 | 2640.24 ± 331.01 | | `echo 30 \| wasmtime ./builtin_fib.wasm` | 11.6 ± 0.6 | 10.3 | 13.2 | 1.00 |
| `echo 30 \| wasmtime ./fib_interpreted_let.wasm` | 32808.0 ± 126.9 | 32655.0 | 33015.6 | 7329.58 ± 918.47 | | `echo 30 \| wasmtime ./fib_compiled_manual.wasm` | 468.8 ± 4.1 | 462.5 | 477.2 | 40.57 ± 2.03 |
| `echo 30 \| wasmtime ./builtin_fib.wasm` | 11.4 ± 1.8 | 10.1 | 28.6 | 2.55 ± 0.52 | | `scheme --script ./fib.scm 30` | 53.4 ± 0.8 | 52.2 | 57.4 | 4.62 ± 0.24 |
| `echo 30 \| wasmtime ./fib_compiled_manual.wasm` | 562.4 ± 3.9 | 556.2 | 569.0 | 125.64 ± 15.76 | | `scheme --script ./fib_let.scm 30` | 53.6 ± 0.9 | 52.4 | 56.7 | 4.64 ± 0.24 |
| `echo 30 \| wasmtime ./rust_fib/target/wasm32-wasi/debug/rust_let.wasm` | 29.8 ± 2.3 | 28.5 | 47.0 | 6.66 ± 0.98 | | `python3 ./fib.py 30` | 284.7 ± 5.6 | 276.9 | 292.7 | 24.64 ± 1.30 |
| `echo 30 \| wasmtime ./rust_fib/target/wasm32-wasi/release/rust_let.wasm` | 19.0 ± 2.1 | 17.6 | 36.9 | 4.25 ± 0.71 | | `python3 ./fib_let.py 30` | 299.8 ± 5.3 | 291.5 | 304.7 | 25.94 ± 1.36 |
| `echo 30 \| ./rust_fib/target/debug/rust_let` | 8.3 ± 0.5 | 7.2 | 10.3 | 1.86 ± 0.26 | | `echo 30 \| wasmtime ./rust_fib/target/wasm32-wasi/debug/rust_let.wasm` | 29.8 ± 0.7 | 28.7 | 32.5 | 2.58 ± 0.14 |
| `echo 30 \| ./rust_fib/target/release/rust_let` | 4.5 ± 0.6 | 3.2 | 6.2 | 1.00 | | `echo 30 \| wasmtime ./rust_fib/target/wasm32-wasi/release/rust_let.wasm` | 18.5 ± 0.6 | 17.4 | 20.4 | 1.60 ± 0.09 |
| `scheme --script ./fib.scm 30` | 53.7 ± 0.7 | 52.8 | 55.5 | 11.99 ± 1.51 |
| `scheme --script ./fib_let.scm 30` | 53.3 ± 0.5 | 52.5 | 54.5 | 11.91 ± 1.50 |
| `python3 ./fib.py 30` | 287.6 ± 3.3 | 282.1 | 292.7 | 64.26 ± 8.08 |
| `python3 ./fib_let.py 30` | 304.3 ± 3.6 | 299.4 | 310.0 | 67.99 ± 8.55 |
| `echo 30 \| java -jar ./clojure_fib/target/uberjar/clojure_fib-0.1.0-SNAPSHOT-standalone.jar` | 686.2 ± 14.6 | 676.0 | 725.2 | 153.29 ± 19.47 |
| `echo 30 \| java -jar ./clojure_hi/target/uberjar/clojure_hi-0.1.0-SNAPSHOT-standalone.jar` | 658.2 ± 13.2 | 639.2 | 679.3 | 147.05 ± 18.65 |