Clojure 地图查找速度非常快,而且并不特别依赖于地图的大小。
事实上,它们几乎与纯 Java HashMap 一样快,同时享有许多优于传统 HashMap 的优势,包括不可变和线程安全。
如果您每秒只进行 30-40 次查找,那么我保证 无论您使用什么作为键,您都不会注意到差异。担心这一点会被视为过早的优化。
让我们证明一下:以下代码使用字符串作为键进行了一百万次地图查找:
(def str-keys (map str (range 1000)))
(def m (zipmap str-keys (range 1000)))
(time (dotimes [i 1000] (doseq [k str-keys] (m k))))
=> "Elapsed time: 69.082224 msecs"
以下使用关键字作为键进行一百万次地图查找:
(def kw-keys (map #(keyword (str %)) (range 1000)))
(def m (zipmap kw-keys (range 1000)))
(time (dotimes [i 1000] (doseq [k kw-keys] (m k))))
=> "Elapsed time: 59.212864 msecs"
对于符号:
(def sym-keys (map #(symbol (str %)) (range 1000)))
(def m (zipmap sym-keys (range 1000)))
(time (dotimes [i 1000] (doseq [k sym-keys] (m k))))
=> "Elapsed time: 61.590925 msecs"
在我的测试中,Symbols 和 Keywords 比 Strings 稍快,但仍然可以很容易地用统计错误来解释差异,并且在所有情况下,每次查找的平均执行时间都小于 100 纳秒 .
因此,您的 30-40 次查找可能会占用您 CPU 时间的 0.001%(这甚至考虑到在实际应用中,由于缓存问题,查找可能会慢几倍)
特别是关键字稍微快一些的可能原因是它们被实习(因此可以使用引用相等来检查相等)。但正如您所看到的,差异非常小,您真的不需要担心。