瀏覽代碼

updated Luminus benchmark (#2682)

* updated Luminus benchmark

benchmark cleanup

updated db config

cleanup

* added direct linking for Luminus
Dmitri Sotnikov 8 年之前
父節點
當前提交
25738cc81b

+ 27 - 26
frameworks/Clojure/luminus/hello/project.clj

@@ -1,33 +1,34 @@
 (defproject hello "0.1.0-SNAPSHOT"
 
-  :description "FIXME: write description"
-  :url "http://example.com/FIXME"
+  :description "TechEmpower Luminus benchmark"
+  :url "https://github.com/TechEmpower/FrameworkBenchmarks"
 
-  :dependencies [[org.clojure/clojure "1.8.0"]
-                 [selmer "1.0.2"]
-                 [markdown-clj "0.9.86"]
-                 [ring-middleware-format "0.7.0"]
-                 [metosin/ring-http-response "0.6.5"]
-                 [bouncer "1.0.0"]
+  :dependencies [[org.clojure/clojure "1.9.0-alpha15"]
+                 [cheshire "5.7.0"]
+                 [selmer "1.10.7"]
+                 [markdown-clj "0.9.98"]
+                 [metosin/muuntaja "0.2.1"]
+                 [metosin/ring-http-response "0.8.2"]
+                 [bouncer "1.0.1"]
                  [org.webjars/bootstrap "4.0.0-alpha.2"]
-                 [org.webjars/font-awesome "4.5.0"]
-                 [org.webjars.bower/tether "1.1.1"]
-                 [org.webjars/jquery "2.2.1"]
+                 [org.webjars/font-awesome "4.7.0"]
+                 [org.webjars.bower/tether "1.4.0"]
+                 [org.webjars/jquery "3.2.0"]
                  [org.clojure/tools.logging "0.3.1"]
                  [com.taoensso/tower "3.0.2"]
-                 [compojure "1.5.0"]
+                 [compojure "1.5.2"]
                  [ring-webjars "0.1.1"]
-                 [ring/ring-defaults "0.2.0"]
-                 [mount "0.1.10"]
-                 [cprop "0.1.6"]
-                 [org.clojure/tools.cli "0.3.3"]
+                 [ring/ring-defaults "0.2.3"]
+                 [mount "0.1.11"]
+                 [cprop "0.1.10"]
+                 [org.clojure/tools.cli "0.3.5"]
                  [luminus-nrepl "0.1.4"]
                  [org.webjars/webjars-locator-jboss-vfs "0.1.0"]
-                 [luminus-immutant "0.1.9"]
-                 [luminus-migrations "0.1.0"]
-                 [conman "0.4.5"]
-                 [org.postgresql/postgresql "9.4-1206-jdbc4"]
-                 [luminus-log4j "0.1.3"]]
+                 [luminus-immutant "0.2.3"]
+                 [luminus-migrations "0.3.0"]
+                 [conman "0.6.3"]
+                 [org.postgresql/postgresql "9.4.1212"]
+                 [luminus-log4j "0.1.5"]]
 
   :min-lein-version "2.0.0"
 
@@ -42,18 +43,18 @@
             [migratus-lein "0.2.6"]]
   :profiles
   {:uberjar {:omit-source true
-
+             :jvm-opts ["-D\"clojure.compiler.direct-linking=true\""]
              :aot :all
              :uberjar-name "hello.jar"
              :source-paths ["env/prod/clj"]
              :resource-paths ["env/prod/resources"]}
    :dev           [:project/dev :profiles/dev]
    :test          [:project/test :profiles/test]
-   :project/dev  {:dependencies [[prone "1.0.2"]
+   :project/dev  {:dependencies [[prone "1.1.4"]
                                  [ring/ring-mock "0.3.0"]
-                                 [ring/ring-devel "1.4.0"]
-                                 [pjstadig/humane-test-output "0.7.1"]
-                                 [mvxcvi/puget "1.0.0"]]
+                                 [ring/ring-devel "1.5.1"]
+                                 [pjstadig/humane-test-output "0.8.1"]
+                                 [mvxcvi/puget "1.0.1"]]
 
 
                   :source-paths ["env/dev/clj" "test/clj"]

+ 1 - 1
frameworks/Clojure/luminus/hello/resources/sql/queries.sql

@@ -5,7 +5,7 @@ SELECT * FROM "Fortune"
 -- :name update-world! :! :1
 -- update an existing world record
 UPDATE "World"
-SET "randomnumber" = :randomNumber
+SET "randomnumber" = :randomnumber
 WHERE id = :id
 
 -- :name get-world :? :1

+ 18 - 27
frameworks/Clojure/luminus/hello/src/clj/hello/db/core.clj

@@ -4,25 +4,15 @@
     [clojure.java.jdbc :as jdbc]
     [conman.core :as conman]
     [hello.config :refer [env]]
-    [mount.core :refer [defstate]]
-    [clojure.set :refer [rename-keys]])
-  (:import org.postgresql.util.PGobject
-           org.postgresql.jdbc4.Jdbc4Array
-           clojure.lang.IPersistentMap
-           clojure.lang.IPersistentVector
-           [java.sql
-            BatchUpdateException
-            Date
-            Timestamp
-            PreparedStatement]))
+    [mount.core :refer [defstate]]))
 
 (defstate ^:dynamic *db*
           :start (conman/connect!
-                   {:adapter    :postgresql
-                    :init-size  10
+                   {:init-size  10
                     :min-idle   1
                     :max-idle   10
                     :max-active 64
+                    :maximum-pool-size 256
                     :jdbc-url   (:database-url env)})
           :stop (conman/disconnect! *db*))
 
@@ -30,23 +20,24 @@
 
 ;; queries
 
-(defn get-query-count [queries]
+(defn get-query-count
   "Parse provided string value of query count, clamping values to between 1 and 500."
-  (let [n (try (Integer/parseInt queries)
-               (catch Exception _ 1))] ; default to 1 on parse failure
+  [^String queries]
+  (let [n ^long (try (Integer/parseInt queries)
+                     (catch Exception _ 1))] ; default to 1 on parse failure
     (cond
-      (< n 1)   1
-      (> n 500) 500
-      :else     n)))
+      (< ^long n 1) 1
+      (> ^long n 500) 500
+      :else n)))
 
-(defn get-random-world []
-  (-> (get-world {:id (inc (rand-int 10000))})
-      (rename-keys {:randomnumber :randomNumber})))
+(defn run-query []
+  (get-world {:id (unchecked-inc ^long (rand-int 10000))}))
 
 (defn run-queries
   "Run the specified number of queries, return the results"
-  [queries]
-  (repeatedly (get-query-count queries) get-random-world))
+  [^String queries]
+  (let [query-count (get-query-count queries)]
+    (repeatedly query-count #(get-world {:id (unchecked-inc ^long (rand-int 10000))}))))
 
 (defn get-fortunes []
    "Fetch the full list of Fortunes from the database, sort them by the fortune
@@ -59,7 +50,7 @@
 (defn set-random-number!
   "set a new randomNumber, persist, and return the record"
   [{:keys [id]}]
-  (let [w {:id id :randomNumber (inc (rand-int 9999))}]
+  (let [w {:id id :randomnumber (unchecked-inc ^long (rand-int 9999))}]
     (try
         (update-world! w)
         (catch java.sql.BatchUpdateException e
@@ -69,5 +60,5 @@
 (defn update-and-persist
   "Changes the :randomNumber of a number of world entities.
   Persists the changes to sql then returns the updated entities"
-  [queries]
-  (doall (map set-random-number! (run-queries queries))))
+  [^String queries]
+  (mapv set-random-number! (run-queries queries)))

+ 1 - 3
frameworks/Clojure/luminus/hello/src/clj/hello/layout.clj

@@ -7,7 +7,6 @@
             [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]))
 
 
-(declare ^:dynamic *app-context*)
 (parser/set-resource-path!  (clojure.java.io/resource "templates"))
 (parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
 (filters/add-filter! :markdown (fn [content] [:safe (md-to-html-string content)]))
@@ -21,8 +20,7 @@
         template
         (assoc params
           :page template
-          :csrf-token *anti-forgery-token*
-          :servlet-context *app-context*)))
+          :csrf-token *anti-forgery-token*)))
     "text/html; charset=utf-8"))
 
 (defn error-page

+ 0 - 67
frameworks/Clojure/luminus/hello/src/clj/hello/middleware.clj

@@ -1,67 +0,0 @@
-(ns hello.middleware
-  (:require [hello.layout :refer [*app-context* error-page]]
-            [clojure.tools.logging :as log]
-            [hello.env :refer [defaults]]
-            [hello.config :refer [env]]
-            [ring.middleware.flash :refer [wrap-flash]]
-            [immutant.web.middleware :refer [wrap-session]]
-            [ring.middleware.webjars :refer [wrap-webjars]]
-            [ring.middleware.defaults :refer [site-defaults wrap-defaults]]
-            [ring.middleware.anti-forgery :refer [wrap-anti-forgery]]
-            [ring.middleware.format :refer [wrap-restful-format]])
-  (:import [javax.servlet ServletContext]))
-
-(defn wrap-context [handler]
-  (fn [request]
-    (binding [*app-context*
-              (if-let [context (:servlet-context request)]
-                ;; If we're not inside a servlet environment
-                ;; (for example when using mock requests), then
-                ;; .getContextPath might not exist
-                (try (.getContextPath ^ServletContext context)
-                     (catch IllegalArgumentException _ context))
-                ;; if the context is not specified in the request
-                ;; we check if one has been specified in the environment
-                ;; instead
-                (:app-context env))]
-      (handler request))))
-
-(defn wrap-internal-error [handler]
-  (fn [req]
-    (try
-      (handler req)
-      (catch Throwable t
-        (log/error t)
-        (error-page {:status 500
-                     :title "Something very bad has happened!"
-                     :message "We've dispatched a team of highly trained gnomes to take care of the problem."})))))
-
-(defn wrap-csrf [handler]
-  (wrap-anti-forgery
-    handler
-    {:error-response
-     (error-page
-       {:status 403
-        :title "Invalid anti-forgery token"})}))
-
-(defn wrap-formats [handler]
-  (let [wrapped (wrap-restful-format
-                  handler
-                  {:formats [:json-kw :transit-json :transit-msgpack]})]
-    (fn [request]
-      ;; disable wrap-formats for websockets
-      ;; since they're not compatible with this middleware
-      ((if (:websocket? request) handler wrapped) request))))
-
-(defn wrap-base [handler]
-  (-> ((:middleware defaults) handler)
-      wrap-formats
-      wrap-webjars
-      wrap-flash
-      (wrap-session {:cookie-attrs {:http-only true}})
-      (wrap-defaults
-        (-> site-defaults
-            (assoc-in [:security :anti-forgery] false)
-            (dissoc :session)))
-      wrap-context
-      wrap-internal-error))

+ 4 - 7
frameworks/Clojure/luminus/hello/src/clj/hello/routes/home.clj

@@ -24,10 +24,7 @@
 (defn single-query-test
   "Test 2: Single database query"
   []
-  (-> 1
-      db/run-queries
-      first
-      encode-json-response))
+  (encode-json-response (db/run-query)))
 
 (defn multiple-query-test
   "Test 3: Multiple database query"
@@ -61,8 +58,8 @@
 (defroutes default-routes
   (GET "/"                 []        "Hello, World!")
   (GET "/db"               []        (single-query-test))
-  (GET "/queries/"         []        (multiple-query-test 1))
-  (GET "/queries/:queries" [queries] (multiple-query-test queries))
   (GET "/fortunes"         []        (fortunes))
-  (GET "/updates/"         []        (db-update 1))
+  (GET "/queries/"         []        (multiple-query-test "1"))
+  (GET "/queries/:queries" [queries] (multiple-query-test queries))
+  (GET "/updates/"         []        (db-update "1"))
   (GET "/updates/:queries" [queries] (db-update queries)))

+ 1 - 1
frameworks/Clojure/luminus/hello/test/clj/hello/test/db/core.clj

@@ -12,7 +12,7 @@
     (mount/start
       #'hello.config/env
       #'hello.db.core/*db*)
-    (migrations/migrate ["migrate"] (env :database-url))
+    (migrations/migrate ["migrate"] (select-keys env [:database-url]))
     (f)))
 
 (deftest test-users