Я задаю этот вопрос, чтобы выяснить, почему мой счетчик времени выполнения увеличивается.
У меня есть простая программа, имеющая вектор ссылок на числа и несколько потоков, одновременно пытающихся записать в один изчисла в векторе.
Изменяя размер вектора (это называется гистограммой в программе), я могу уменьшить количество прерванных транзакций, потому что наборы записи не конфликтуют для больших векторных размеров.Размер в программе называется «гист-размер».
Однако, когда я уменьшаю количество прерванных транзакций, время выполнения увеличивается!В моей системе, когда я уменьшаю количество прерванных транзакций с 2500 до 300, время выполнения увеличивается с 460 миллисекунд до 620 миллисекунд.Очевидно, что в игре есть что-то еще, но я просто не могу понять, что это такое.
Для меня это абсолютно бессмысленно.Вот код ... может кто-нибудь сказать мне, что происходит?
(def histsize 5000)
(def histogram (vec (take histsize (repeatedly #(ref 0)))))
(def abort-counter (atom 0))
(defn inc_alter []
(loop [counter 10000]
(if (zero? counter)
nil
(do
(dosync
(try
(let [index (mod counter histsize)]
(ref-set (histogram index) (inc @(histogram index))))
(catch Throwable t
(do
(swap! abort-counter inc)
(throw t)))))
(recur (dec counter))))))
(defn run-histo []
(let [threads (for [x (range 0 20)] (Thread. #(inc_alter)))]
(do
(time
(do (doall (map #(.start %) threads))
(doall (map #(.join %) threads))))
(println "total aborts: " @abort-counter) )))
(run-histo)