|
| 1 | +#!/usr/bin/env clojure |
| 2 | + |
| 3 | +"USAGE: ./bench [rebuild]? [<version>|<version-vm> ...]? [<bench-name> ...]?" |
| 4 | + |
| 5 | +(require |
| 6 | + '[clojure.edn :as edn] |
| 7 | + '[clojure.java.io :as io] |
| 8 | + '[clojure.java.shell :as sh] |
| 9 | + '[clojure.string :as str]) |
| 10 | + |
| 11 | +(defn sh [& cmd] |
| 12 | + (let [res (apply sh/sh cmd)] |
| 13 | + (when (not= 0 (:exit res)) |
| 14 | + (throw (ex-info "ERROR" res))) |
| 15 | + (str/trim (:out res)))) |
| 16 | + |
| 17 | +(defn copy [^java.io.InputStream input ^java.io.Writer output] |
| 18 | + (let [^"[C" buffer (make-array Character/TYPE 1024) |
| 19 | + in (java.io.InputStreamReader. input "UTF-8") |
| 20 | + w (java.io.StringWriter.)] |
| 21 | + (loop [] |
| 22 | + (let [size (.read in buffer 0 (alength buffer))] |
| 23 | + (if (pos? size) |
| 24 | + (do (.write output buffer 0 size) |
| 25 | + (.flush output) |
| 26 | + (.write w buffer 0 size) |
| 27 | + (recur)) |
| 28 | + (str w)))))) |
| 29 | + |
| 30 | +(defn run [& cmd] |
| 31 | + (let [cmd (remove nil? cmd) |
| 32 | + proc (.exec (Runtime/getRuntime) |
| 33 | + (into-array String cmd) |
| 34 | + (@#'sh/as-env-strings sh/*sh-env*) |
| 35 | + (io/as-file sh/*sh-dir*)) |
| 36 | + out (promise)] |
| 37 | + (with-open [stdout (.getInputStream proc) |
| 38 | + stderr (.getErrorStream proc)] |
| 39 | + (future (deliver out (copy stdout *out*))) |
| 40 | + (future (copy stderr *err*)) |
| 41 | + (.close (.getOutputStream proc)) |
| 42 | + (let [code (.waitFor proc)] |
| 43 | + (when (not= code 0) |
| 44 | + (throw (ex-info "ERROR" {:cmd cmd :code code}))) |
| 45 | + @out)))) |
| 46 | + |
| 47 | + |
| 48 | +(def opts |
| 49 | + (loop [opts {:rebuild false |
| 50 | + :versions [] |
| 51 | + :benchmarks []} |
| 52 | + args *command-line-args*] |
| 53 | + (if-some [arg (first args)] |
| 54 | + (cond |
| 55 | + (= "rebuild" arg) |
| 56 | + (recur (assoc opts :rebuild true) (next args)) |
| 57 | + |
| 58 | + (re-matches #"(jvm|v8|dtmc)" arg) |
| 59 | + (recur (update opts :versions conj ["latest" arg]) (next args)) |
| 60 | + |
| 61 | + (re-matches #"(\d+\.\d+\.\d+|latest)" arg) |
| 62 | + (recur (update opts :versions conj [arg "jvm"]) (next args)) |
| 63 | + |
| 64 | + (re-matches #"(\d+\.\d+\.\d+|latest)-(jvm|v8|dtmc)" arg) |
| 65 | + (let [[_ version vm] (re-matches #"(\d+\.\d+\.\d+|latest)-(jvm|v8|dtmc)" arg)] |
| 66 | + (recur (update opts :versions conj [version vm]) (next args))) |
| 67 | + |
| 68 | + :else |
| 69 | + (recur (update opts :benchmarks conj arg) (next args))) |
| 70 | + opts))) |
| 71 | + |
| 72 | + |
| 73 | +(defn run-benchmarks [version vm benchmarks] |
| 74 | + (case vm |
| 75 | + "jvm" |
| 76 | + (apply run "clojure" "-Sdeps" |
| 77 | + (if (= "latest" version) |
| 78 | + "{:paths [\"src\" \"../src\" \"../target/classes\"]}" |
| 79 | + (str "{:deps {datascript {:mvn/version \"" version "\"}}}")) |
| 80 | + "-m" "datascript-bench.datascript" |
| 81 | + benchmarks) |
| 82 | + |
| 83 | + "v8" |
| 84 | + (apply run "node" "run_v8.js" benchmarks) |
| 85 | + |
| 86 | + "dtmc" |
| 87 | + (apply run "clojure" "-Sdeps" |
| 88 | + (str "{" |
| 89 | + " :paths [\"src\" \"src-dtmc\"]" |
| 90 | + " :deps {com.datomic/datomic-free {:mvn/version \"" (if (= "latest" version) "0.9.5703" version) "\"}}" |
| 91 | + "}") |
| 92 | + "-m" "datascript-bench.datomic" |
| 93 | + benchmarks) |
| 94 | + )) |
| 95 | + |
| 96 | + |
| 97 | +(def default-benchmarks |
| 98 | + ["add-1" |
| 99 | + "add-5" |
| 100 | + "add-all" |
| 101 | + "init" |
| 102 | + "retract-5" |
| 103 | + "q1" |
| 104 | + "q2" |
| 105 | + "q3" |
| 106 | + "q4" |
| 107 | + "qpred1" |
| 108 | + "qpred2"]) |
| 109 | + |
| 110 | + |
| 111 | +(def default-versions |
| 112 | + [["latest" "jvm"]]) |
| 113 | + |
| 114 | + |
| 115 | +(binding [sh/*sh-env* (merge {} (System/getenv) {}) |
| 116 | + sh/*sh-dir* "."] |
| 117 | + (let [{:keys [rebuild benchmarks versions]} opts] |
| 118 | + (when rebuild |
| 119 | + (binding [sh/*sh-dir* ".."] |
| 120 | + (run "lein" "do" "clean," "javac," "cljsbuild" "once" "bench"))) |
| 121 | + (let [benchmarks (if (empty? benchmarks) default-benchmarks benchmarks) |
| 122 | + versions (if (empty? versions) default-versions versions)] |
| 123 | + (print "version \t") |
| 124 | + (doseq [b benchmarks] (print b "\t")) |
| 125 | + (println) |
| 126 | + (doseq [[version vm] versions] |
| 127 | + (print (str version "-" vm) "\t") |
| 128 | + (flush) |
| 129 | + (run-benchmarks version vm benchmarks))))) |
| 130 | + |
| 131 | +(shutdown-agents) |
| 132 | +; (System/exit 0) |
0 commit comments