Поиск на карте Clojure выполняется очень быстро и не зависит от размера карты.
На самом деле они почти так же быстры, как чистые Java HashMaps, но обладают многими преимуществами по сравнению с традиционными HashMaps, в том числе неизменяемыми и поточно-ориентированными.
Если вы выполняете только 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"
В моих тестах символы и ключевые слова были немного быстрее, чем строки, но, тем не менее, эту разницу легко объяснить статистической ошибкой, и среднее время выполнения для поиска составило менее 100 наносекунд для всех случаев.
Таким образом, ваши 30-40 поисков, вероятно, занимают порядка 0,001% времени вашего процессора (это даже учитывает тот факт, что в реальном приложении поиск будет, вероятно, в несколько раз медленнее из-за проблем с кэшированием)
Вероятная причина, по которой ключевые слова, в частности, немного быстрее, заключается в том, что они интернированы (и поэтому могут использовать ссылочное равенство для проверки на равенство). Но, как вы видите, разница достаточно мала, поэтому вам не нужно об этом беспокоиться.