diff --git a/.lsp/config.edn b/.lsp/config.edn index 88be51f099..821b9d4663 100644 --- a/.lsp/config.edn +++ b/.lsp/config.edn @@ -1,4 +1,13 @@ {:source-aliases #{:cljs} :source-paths-ignore-regex ["src/resources" "target.*"] :paths-ignore-regex ["src/resources"] - :clean {:ns-inner-blocks-indentation :same-line}} + :clean {:ns-inner-blocks-indentation :same-line} + :additional-snippets [{:name "profile" + :detail "Insert profile-fn" + :snippet + " +(comment +(require '[logseq.common.profile :as c.p]) +(do (vreset! c.p/*key->call-count {}) + (vreset! c.p/*key->time-sum {})) +(c.p/profile-fn! $1) )"}]} diff --git a/deps/common/src/logseq/common/profile.clj b/deps/common/src/logseq/common/profile.clj new file mode 100644 index 0000000000..072b3f4c44 --- /dev/null +++ b/deps/common/src/logseq/common/profile.clj @@ -0,0 +1,18 @@ +(ns logseq.common.profile + "Utils for profiling") + +(defmacro profile-fn! + [f & {:keys [print-on-call? gen-k-fn] + :or {print-on-call? true}}] + `(let [origin-f# ~f + gen-k-fn# (or ~gen-k-fn (constantly (keyword ~f)))] + (set! ~f (fn [& args#] + (let [start# (cljs.core/system-time) + r# (apply origin-f# args#) + end# (cljs.core/system-time) + k# (gen-k-fn# r#)] + (vswap! *key->call-count update k# inc) + (vswap! *key->time-sum update k# #(+ % (- end# start#))) + (when ~print-on-call? + (println "call-count:" (get @*key->call-count k#) "time-sum(ms):" (get @*key->time-sum k#))) + r#))))) diff --git a/deps/common/src/logseq/common/profile.cljs b/deps/common/src/logseq/common/profile.cljs new file mode 100644 index 0000000000..484eac81e3 --- /dev/null +++ b/deps/common/src/logseq/common/profile.cljs @@ -0,0 +1,11 @@ +(ns logseq.common.profile + "Utils for profiling" + (:require-macros [logseq.common.profile])) + +(def *key->call-count + "key -> count" + (volatile! {})) + +(def *key->time-sum + "docstring" + (volatile! {})) diff --git a/deps/db/src/logseq/db/frontend/entity_util.cljs b/deps/db/src/logseq/db/frontend/entity_util.cljs index d3bde674b1..1e9d7dca86 100644 --- a/deps/db/src/logseq/db/frontend/entity_util.cljs +++ b/deps/db/src/logseq/db/frontend/entity_util.cljs @@ -7,10 +7,18 @@ (defn- has-tag? [entity tag-ident] - (let [tags (:block/tags entity)] - (some (fn [t] (or (= (:db/ident t) tag-ident) - (= t tag-ident))) - (if (coll? tags) tags [tags])))) + (some (fn [t] + (let [db-ident (:db/ident t)] + (if (keyword? db-ident) + (identical? (.-fqn db-ident) (.-fqn ^keyword tag-ident)) + (keyword-identical? t tag-ident)))) + (:block/tags entity))) + +(comment + (require '[logseq.common.profile :as c.p]) + (do (vreset! c.p/*key->call-count {}) + (vreset! c.p/*key->time-sum {})) + (c.p/profile-fn! has-tag? :print-on-call? false)) (defn internal-page? [entity] @@ -18,8 +26,8 @@ (defn class? [entity] - (or (= (:db/ident entity) :logseq.class/Tag) - (has-tag? entity :logseq.class/Tag))) + (or (has-tag? entity :logseq.class/Tag) + (keyword-identical? (:db/ident entity) :logseq.class/Tag))) (defn property? [entity] @@ -32,7 +40,7 @@ ;; db based graph (has-tag? entity :logseq.class/Whiteboard) ;; file based graph - (= "whiteboard" (:block/type entity)))) + (identical? "whiteboard" (:block/type entity)))) (defn closed-value? [entity] @@ -45,7 +53,7 @@ ;; db based graph (has-tag? entity :logseq.class/Journal) ;; file based graph - (= "journal" (:block/type entity)))) + (identical? "journal" (:block/type entity)))) (defn page? [entity]