Почему счетчик времени выполнения увеличивается, когда количество прерванных потоков также увеличивается? - PullRequest
3 голосов
/ 15 ноября 2011

Я задаю этот вопрос, чтобы выяснить, почему мой счетчик времени выполнения увеличивается.

У меня есть простая программа, имеющая вектор ссылок на числа и несколько потоков, одновременно пытающихся записать в один изчисла в векторе.

Изменяя размер вектора (это называется гистограммой в программе), я могу уменьшить количество прерванных транзакций, потому что наборы записи не конфликтуют для больших векторных размеров.Размер в программе называется «гист-размер».

Однако, когда я уменьшаю количество прерванных транзакций, время выполнения увеличивается!В моей системе, когда я уменьшаю количество прерванных транзакций с 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)

Ответы [ 2 ]

2 голосов
/ 08 июля 2012

Может быть, дело только в оптимизации времени выполнения JVM. Первый запуск может занять больше времени, но пробовали ли вы последовательные прогоны? Я увеличил размер вектора histogram с 5000 до 50000, и в течение 10 последовательных прогонов получил такой результат:

; 5000
("Elapsed time: 1221.597 msecs" total aborts:  203
 "Elapsed time: 466.733 msecs" total aborts:  64
 "Elapsed time: 484.87 msecs" total aborts:  127
 "Elapsed time: 730.735 msecs" total aborts:  127
 "Elapsed time: 461.475 msecs" total aborts:  97
 "Elapsed time: 488.735 msecs" total aborts:  178
 "Elapsed time: 484.342 msecs" total aborts:  42
 "Elapsed time: 447.577 msecs" total aborts:  96
 "Elapsed time: 478.22 msecs" total aborts:  178
 "Elapsed time: 402.598 msecs" total aborts: 125
 nil nil nil nil nil nil nil nil nil nil)


; 50000
("Elapsed time: 21.374 msecs" total aborts:  20
 "Elapsed time: 48.55 msecs" total aborts:  20
 "Elapsed time: 16.818 msecs" total aborts:  20
 "Elapsed time: 13.407 msecs" total aborts:  20
 "Elapsed time: 14.546 msecs" total aborts:  20
 "Elapsed time: 16.687 msecs" total aborts:  20
 "Elapsed time: 12.22 msecs" total aborts:  20
 "Elapsed time: 13.491 msecs" total aborts:  20
 "Elapsed time: 11.616 msecs" total aborts:  20
 "Elapsed time: 11.896 msecs" total aborts:  20
 nil nil nil nil nil nil nil nil nil nil)

Модифицированный run-histo:

(defn run-histo []
  (for [x (range 10)]  
   (let [threads (for [x (range 0 20)] (Thread. #(inc_alter)))]
     (do
       (reset! abort-counter 0)
       (time
        (do (doall (map #(.start %) threads))
            (doall (map #(.join %) threads))))
       (println "total aborts: " @abort-counter) ))))

Как это работает на вашем компьютере?

0 голосов
/ 15 ноября 2011

Когда у вас меньше количества прерываний, поток будет выполнять больше «циклов» и, следовательно, потребуется больше времени для завершения, т.е. они будут обрабатывать большее количество «счетчиков».Принимая во внимание, что когда в вашем блоке catch больше прерываний, чем из-за throw, поток прерывается и, следовательно, скорость выхода для потоков будет намного выше, и, следовательно, они будут обрабатывать меньше «счетчика» и будут занимать меньше времени

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