From ee614ea309ee4263c41ca0caffac2e5fe919358e Mon Sep 17 00:00:00 2001 From: Miguel de Benito Delgado Date: Sun, 20 Sep 2026 15:11:06 +0200 Subject: [PATCH] :construction: WIP Step 1, scaffold cljs benchmark runner --- .clj-kondo/config.edn | 2 +- frontend/deps.edn | 4 ++ frontend/package.json | 4 +- frontend/shadow-cljs.edn | 38 +++++++++++ .../test/benches/render_wasm/browser.cljs | 33 +++++++++ frontend/test/benches/render_wasm/runner.cljs | 68 +++++++++++++++++++ 6 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 frontend/test/benches/render_wasm/browser.cljs create mode 100644 frontend/test/benches/render_wasm/runner.cljs diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 0caf92fbc4..cb83ee6565 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -36,7 +36,7 @@ "^(?:backend|frontend|exporter|common)/deps.edn" "^(?:backend|frontend|exporter|common)/scripts/" "^(?:backend|frontend|exporter|common)/dev/" - "^(?:backend|frontend|exporter|common)/test/"] + "^(?:backend|frontend|exporter|common)/test/(?!benches/)"] :linter-name true} diff --git a/frontend/deps.edn b/frontend/deps.edn index 7e19542857..1aaab63117 100644 --- a/frontend/deps.edn +++ b/frontend/deps.edn @@ -67,4 +67,8 @@ "-Dpenpot.wasm.profile-marks=true" "-XX:+UnlockExperimentalVMOptions" "-XX:CompileCommand=blackhole,criterium.blackhole.Blackhole::consume"]} + + :renderer-bench + {:main-opts ["-m" "shadow.cljs.devtools.cli"] + :jvm-opts ["-Dpenpot.wasm.profile-marks=false"]} }} diff --git a/frontend/package.json b/frontend/package.json index 4a73f7a7ec..60d06f8ac9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "build:storybook:assets": "node ./scripts/build-storybook-assets.js", "build:storybook:cljs": "clojure -M:dev:shadow-cljs compile storybook", "build:wasm": "../render-wasm/build frontend", + "build:renderer-benchmarks:runner": "clojure -M:dev:renderer-bench release bench-render-wasm-runner", "build:app:libs": "node ./scripts/build-libs.js", "build:app:main": "clojure -M:dev:shadow-cljs release main worker", "build:app:worker": "clojure -M:dev:shadow-cljs release worker", @@ -30,8 +31,9 @@ "fmt:clj": "cljfmt fix --parallel=true src/ test/", "fmt:js": "prettier -c src/**/*.stories.jsx -c playwright/**/*.js -c scripts/**/*.js -c text-editor/**/*.js -w", "fmt:scss": "prettier -c resources/styles -c src/**/*.scss -w", - "lint:clj": "clj-kondo --fail-level error --config-dir ../.clj-kondo --lint ../common/src src/", + "lint:clj": "clj-kondo --fail-level error --config-dir ../.clj-kondo --lint ../common/src src/ test/benches/", "lint:js": "exit 0", + "lint:renderer-benchmarks": "clj-kondo --config-dir ../.clj-kondo --lint test/benches/", "lint:scss": "pnpm exec stylelint '{src,resources}/**/*.scss'", "build:test": "pnpm run build:wasm && clojure -M:dev:shadow-cljs compile test", "test": "pnpm run build:test && node target/tests/test.js", diff --git a/frontend/shadow-cljs.edn b/frontend/shadow-cljs.edn index 9956823eeb..45b69d8f2f 100644 --- a/frontend/shadow-cljs.edn +++ b/frontend/shadow-cljs.edn @@ -166,6 +166,44 @@ :output-dir "target/bench/" :main bench/main + :compiler-options + {:output-feature-set :es2020 + :output-wrapper false + :warnings {:fn-deprecated false}} + + :release + {:compiler-options + {:fn-invoke-direct true + :elide-asserts true + :anon-fn-naming-policy :off}}} + + :bench-render-wasm-runner + {:target :node-script + :output-to "target/renderer-benchmarks/runner.cjs" + :output-dir "target/renderer-benchmarks/runner/" + :main benches.render-wasm.runner/-main + :devtools {:autoload false} + + :compiler-options + {:output-feature-set :es2020 + :output-wrapper false + :warnings {:fn-deprecated false}} + + :release + {:compiler-options + {:fn-invoke-direct true + :elide-asserts true + :anon-fn-naming-policy :off}}} + + :bench-render-wasm-browser + {:target :esm + :output-dir "target/renderer-benchmarks/browser/" + :js-options {:js-provider :import} + + :modules + {:browser + {:exports {default benches.render-wasm.browser/bridge}}} + :compiler-options {:output-feature-set :es2020 :output-wrapper false diff --git a/frontend/test/benches/render_wasm/browser.cljs b/frontend/test/benches/render_wasm/browser.cljs new file mode 100644 index 0000000000..4eccbcc2d4 --- /dev/null +++ b/frontend/test/benches/render_wasm/browser.cljs @@ -0,0 +1,33 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS SUBSIDIARY SL + +(ns benches.render-wasm.browser + "Browser entry for the CLJS renderer benchmark suite. + + Requiring `app.render-wasm.api.enums` binds the enum table from the + prepared renderer build's `shared.js` at namespace load time. A missing + `shared.js` fails the compile; a stale or mismatched one throws at load. + + The exported `bridge` is the only handle the Node runner uses inside the + page. Keep the boundary plain data: never pass a compiled CLJS closure + through `page.evaluate`." + (:require + [app.render-wasm.api.enums])) + +(defn ping + "Bridge placeholder that checks the Node/browser boundary. + + TODO(mem:render-wasm/performance/cljs-rewrite/05-browser-load-pilot): + replace with the renderer load and measurement protocol." + [] + #js {"status" "ok"}) + +(def bridge + "Browser-side bridge exported from the compiled module. + + TODO(mem:render-wasm/performance/cljs-rewrite/06-render-and-interaction-protocol): + add `runAttempt`, `dispose` and the render completion protocol." + #js {"ping" ping}) diff --git a/frontend/test/benches/render_wasm/runner.cljs b/frontend/test/benches/render_wasm/runner.cljs new file mode 100644 index 0000000000..1d41284330 --- /dev/null +++ b/frontend/test/benches/render_wasm/runner.cljs @@ -0,0 +1,68 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS SUBSIDIARY SL + +(ns benches.render-wasm.runner + "Node CLI entry for the CLJS renderer benchmark suite. + + Scaffolding only. Commands, options, result reporting and failure + accounting are owned by the tickets referenced below." + (:require + [clojure.string :as str] + [clojure.tools.cli :refer [parse-opts]])) + +(enable-console-print!) + +(def cli-options + [["-h" "--help" "Print this help"]]) + +(defn- argv + [] + (let [args (->> (.-argv js/process) + (array-seq) + (drop 2))] + ;; `pnpm run