Skip to content

Instantly share code, notes, and snippets.

@enaeher
Last active October 4, 2022 18:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save enaeher/fab806cf0d919b094a76101093272713 to your computer and use it in GitHub Desktop.
Save enaeher/fab806cf0d919b094a76101093272713 to your computer and use it in GitHub Desktop.
(ns eli.naeher.datomic-rule-perf
(:require [datomic.api :as d]))
(def uri "datomic:mem://foo")
(d/delete-database uri)
(d/create-database uri)
(def conn (d/connect "datomic:mem://foo"))
(def test-schema [#:db{:ident :user/name
:valueType :db.type/string
:cardinality :db.cardinality/one
:unique :db.unique/identity}
#:db{:ident :user/level
:valueType :db.type/long
:cardinality :db.cardinality/one}])
@(d/transact conn test-schema)
(def some-values (for [i (range 100)]
{:user/name (str "user" i)
:user/level (rand-int 100)}))
@(d/transact conn some-values)
(defn query-rule []
(d/q '[:find ?name
:in $ %
:where
(over-90 ?user)
[?user :user/name ?name]]
(d/db conn)
'[[(over-90 ?user)
[?user :user/level ?level]
[(> ?level 90)]]]))
;; > (time (dotimes [i 1000] (query-rule)))
;; "Elapsed time: 124.013459 msecs"
(defn query-adjacent-rules []
(d/q '[:find ?name
:in $ %
:where
(user-level ?user ?level)
(over-90 ?level)
[?user :user/name ?name]]
(d/db conn)
'[[(over-90 [?value])
[(> ?value 90)]]
[(user-level [?user] ?level)
[?user :user/level ?level]]]))
;; > (time (dotimes [i 1000] (query-adjacent-rules)))
;; "Elapsed time: 405.736084 msecs"
(defn query-nested-rules []
(d/q '[:find ?name
:in $ %
:where
(user-over-90 ?user)
[?user :user/name ?name]]
(d/db conn)
'[[(over-90 [?value])
[(> ?value 90)]]
[(user-over-90 ?user)
[?user :user/level ?level]
(over-90 ?level)]]))
;; > (time (dotimes [i 1000] (query-nested-rules)))
;; "Elapsed time: 280.963292 msecs"
(defn query-inline []
(d/q '[:find ?name
:in $
:where
[?user :user/level ?level]
[(> ?level 90)]
[?user :user/name ?name]]
(d/db conn)))
;; > (time (dotimes [i 1000] (query-inline)))
;; "Elapsed time: 106.287416 msecs"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment