Производительность больших карт в Clojure - PullRequest
5 голосов
/ 12 сентября 2011

У меня есть программа Clojure, которая использует несколько больших карт (1000–2000 элементов), доступ к которым осуществляется 30–40 раз в секунду, и использует строки в качестве ключей. Мне было интересно, есть ли большая разница в производительности, если бы вместо них я использовал ключевые слова или символы?

1 Ответ

17 голосов
/ 12 сентября 2011

Поиск на карте 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% времени вашего процессора (это даже учитывает тот факт, что в реальном приложении поиск будет, вероятно, в несколько раз медленнее из-за проблем с кэшированием)

Вероятная причина, по которой ключевые слова, в частности, немного быстрее, заключается в том, что они интернированы (и поэтому могут использовать ссылочное равенство для проверки на равенство). Но, как вы видите, разница достаточно мала, поэтому вам не нужно об этом беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...