From 7ffbc0c1aec0263a1bc77b6fad295471fcc1ff3b Mon Sep 17 00:00:00 2001 From: David Nolen Date: Sat, 3 Oct 2026 13:03:25 -0400 Subject: [PATCH 1/3] modernize benchmark stuff --- benchmark/cljs/benchmark_runner.cljs | 5 ++++- deps.edn | 2 ++ resources/benchmark.edn | 12 ++++++++++++ script/benchmark | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 resources/benchmark.edn diff --git a/benchmark/cljs/benchmark_runner.cljs b/benchmark/cljs/benchmark_runner.cljs index a4ea583c9c..68bbbc31d8 100644 --- a/benchmark/cljs/benchmark_runner.cljs +++ b/benchmark/cljs/benchmark_runner.cljs @@ -6,7 +6,10 @@ (def println print) -(set! *print-fn* js/print) +(set! *print-fn* + (if (exists? js/print) + js/print + js/console.log)) (simple-benchmark [x 1] (identity x) 1000000) diff --git a/deps.edn b/deps.edn index b7057d93f0..87de8a7f0a 100644 --- a/deps.edn +++ b/deps.edn @@ -23,6 +23,8 @@ :extra-deps {org.clojure/spec.alpha {:mvn/version "0.5.238"}}} :compiler.test.run {:main-opts ["-i" "src/test/clojure/cljs/test_runner.clj" "-e" "(cljs.test-runner/-main)"]} + :benchmark.build {:extra-paths ["benchmark"] + :main-opts ["-m" "cljs.main" "-co" "resources/benchmark.edn" "-c"]} :runtime.test.build {:extra-paths ["src/test/cljs"] :main-opts ["-m" "cljs.main" "-co" "resources/test.edn" "-c"]} :lite.test.build {:extra-paths ["src/test/cljs"] diff --git a/resources/benchmark.edn b/resources/benchmark.edn new file mode 100644 index 0000000000..3f2df2109b --- /dev/null +++ b/resources/benchmark.edn @@ -0,0 +1,12 @@ +{;:optimizations :advanced + :optimizations :simple + :static-fns true + :optimize-constants true + :pretty-print true + :main cljs.benchmark-runner + :browser-repl false + :output-wrapper true + :compiler-stats true + :verbose true + :output-dir "builds/out-adv-bench" + :output-to "builds/out-adv-bench/core-advanced-benchmark.js"} diff --git a/script/benchmark b/script/benchmark index c1ae2d2c87..31d8fb70e9 100755 --- a/script/benchmark +++ b/script/benchmark @@ -3,7 +3,7 @@ rm -rf builds/out-adv-bench mkdir -p builds/out-adv-bench -bin/cljsc benchmark "{:optimizations :advanced :output-wrapper true :compiler-stats true :verbose true :output-dir \"builds/out-adv-bench\"}" > builds/out-adv-bench/core-advanced-benchmark.js +clojure -M:benchmark.build if [ "$V8_HOME" = "" ]; then echo "V8_HOME not set, skipping V8 benchmarks" From 7fb1982e56719e4f67a0b0292b3fa670bbb54581 Mon Sep 17 00:00:00 2001 From: David Nolen Date: Sat, 3 Oct 2026 14:25:58 -0400 Subject: [PATCH 2/3] measure -lookup on larger PAM --- benchmark/cljs/benchmark_runner.cljs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/benchmark/cljs/benchmark_runner.cljs b/benchmark/cljs/benchmark_runner.cljs index 68bbbc31d8..3d9a81c62f 100644 --- a/benchmark/cljs/benchmark_runner.cljs +++ b/benchmark/cljs/benchmark_runner.cljs @@ -175,6 +175,11 @@ (simple-benchmark [coll (array-map :foo :bar)] (assoc coll :baz :woz) 1000000) (simple-benchmark [coll (array-map :foo :bar :baz :woz)] (-lookup coll :baz) 1000000) (simple-benchmark [coll (array-map :foo :bar :baz :woz :lol :rofl)] (-lookup coll :lol) 1000000) +(simple-benchmark + [coll (array-map :foo 1 :bar 2 :baz 3 :woz 4 :lol 5 :rofl 6 :oflr 7 :flro 8 + :foo1 9 :bar1 10 :baz1 11 :woz1 12 :lol1 13 :rofl1 14 :oflr1 15 :flro1 16 + :foo2 17 :bar2 18 :baz2 19 :woz2 20 :lol2 21 :rofl2 22 :oflr2 23 :flro2 24)] + (-lookup coll :flro2) 1000000) (println) (println ";;; array-map w/ symbols") From 03ce50eb3d7e92ad9ce0efbffe5910b4ef4d94b1 Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 3 Oct 2026 15:40:41 -0400 Subject: [PATCH 3/3] :simple more reliable than :advanced for bench, PAM w/ strs case --- benchmark/cljs/benchmark_runner.cljs | 7 ++++++- resources/benchmark.edn | 6 +++--- script/benchmark | 16 ++++++++-------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/benchmark/cljs/benchmark_runner.cljs b/benchmark/cljs/benchmark_runner.cljs index 3d9a81c62f..90e503593c 100644 --- a/benchmark/cljs/benchmark_runner.cljs +++ b/benchmark/cljs/benchmark_runner.cljs @@ -176,10 +176,15 @@ (simple-benchmark [coll (array-map :foo :bar :baz :woz)] (-lookup coll :baz) 1000000) (simple-benchmark [coll (array-map :foo :bar :baz :woz :lol :rofl)] (-lookup coll :lol) 1000000) (simple-benchmark - [coll (array-map :foo 1 :bar 2 :baz 3 :woz 4 :lol 5 :rofl 6 :oflr 7 :flro 8 + [coll (array-map :foo 1 :bar 2 :baz 3 :woz 4 :lol 5 :rofl 6 :oflr 7 :flro 8 :foo1 9 :bar1 10 :baz1 11 :woz1 12 :lol1 13 :rofl1 14 :oflr1 15 :flro1 16 :foo2 17 :bar2 18 :baz2 19 :woz2 20 :lol2 21 :rofl2 22 :oflr2 23 :flro2 24)] (-lookup coll :flro2) 1000000) +(simple-benchmark + [coll (array-map "foo" 1 "bar" 2 "baz" 3 "woz" 4 "lol" 5 "rofl" 6 "oflr" 7 "flro" 8 + "foo1" 9 "bar1" 10 "baz1" 11 "woz1" 12 "lol1" 13 "rofl1" 14 "oflr1" 15 "flro1" 16 + "foo2" 17 "bar2" 18 "baz2" 19 "woz2" 20 "lol2" 21 "rofl2" 22 "oflr2" 23 "flro2" 24)] + (-lookup coll :flro2) 1000000) (println) (println ";;; array-map w/ symbols") diff --git a/resources/benchmark.edn b/resources/benchmark.edn index 3f2df2109b..e56f15a54f 100644 --- a/resources/benchmark.edn +++ b/resources/benchmark.edn @@ -1,4 +1,4 @@ -{;:optimizations :advanced +{;:optimizations :advanced :optimizations :simple :static-fns true :optimize-constants true @@ -8,5 +8,5 @@ :output-wrapper true :compiler-stats true :verbose true - :output-dir "builds/out-adv-bench" - :output-to "builds/out-adv-bench/core-advanced-benchmark.js"} + :output-dir "builds/out-simp-bench" + :output-to "builds/out-simp-bench/core-simp-benchmark.js"} diff --git a/script/benchmark b/script/benchmark index 31d8fb70e9..67363343d0 100755 --- a/script/benchmark +++ b/script/benchmark @@ -1,7 +1,7 @@ #!/bin/sh -rm -rf builds/out-adv-bench -mkdir -p builds/out-adv-bench +rm -rf builds/out-simp-bench +mkdir -p builds/out-simp-bench clojure -M:benchmark.build @@ -9,40 +9,40 @@ if [ "$V8_HOME" = "" ]; then echo "V8_HOME not set, skipping V8 benchmarks" else echo "Benchmarking with V8" - "${V8_HOME}/d8" builds/out-adv-bench/core-advanced-benchmark.js + "${V8_HOME}/d8" builds/out-simp-bench/core-simp-benchmark.js fi if [ "$SPIDERMONKEY_HOME" = "" ]; then echo "SPIDERMONKEY_HOME not set, skipping SpiderMonkey benchmarks" else echo "Benchmarking with SpiderMonkey" - "${SPIDERMONKEY_HOME}/js" -f builds/out-adv-bench/core-advanced-benchmark.js + "${SPIDERMONKEY_HOME}/js" -f builds/out-simp-bench/core-simp-benchmark.js fi if ! hash jsc 2>/dev/null; then echo "jsc not on path, skipping JavaScriptCore benchmarks" else echo "Benchmarking with JavaScriptCore" - jsc -f builds/out-adv-bench/core-advanced-benchmark.js + jsc -f builds/out-simp-bench/core-simp-benchmark.js fi if [ "$NASHORN_HOME" = "" ]; then echo "NASHORN_HOME not set, skipping Nashorn benchmarks" else echo "Benchmarking with Nashorn" - "${NASHORN_HOME}/jjs" builds/out-adv-bench/core-advanced-benchmark.js + "${NASHORN_HOME}/jjs" builds/out-simp-bench/core-simp-benchmark.js fi if [ "$CHAKRACORE_HOME" = "" ]; then echo "CHAKRACORE_HOME not set, skipping ChakraCore benchmarks" else echo "Benchmarking with ChakraCore" - "${CHAKRACORE_HOME}/ch" builds/out-adv-bench/core-advanced-benchmark.js + "${CHAKRACORE_HOME}/ch" builds/out-simp-bench/core-simp-benchmark.js fi if [ "$GRAALVM_HOME" = "" ]; then echo "GRAALVM_HOME not set, skipping GraalVM benchmarks" else echo "Benchmarking with GraalVM" - "${GRAALVM_HOME}/js" builds/out-adv-bench/core-advanced-benchmark.js + "${GRAALVM_HOME}/js" builds/out-simp-bench/core-simp-benchmark.js fi