我在問這個問題,找出爲什麼我的運行時計數增加。爲什麼中止線程數也增加時運行時間計數會增加?
我有一個簡單的程序,它有一個引用數字的向量和一羣線程同時嘗試寫入向量中的一個數字。
通過修改向量的大小(在程序中稱爲直方圖),我可以減少中止事務的數量,因爲對於較大的向量大小,寫入集不會發生衝突。程序中的大小稱爲「histsize」。
但是,當我減少中止事務的數量時,運行時間會上升!在我的系統中,當我將異常事務的數量從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)
我認爲你需要看看每個線程正在使用多長時間 - 嘗試計算最小值,最大值和平均時間。 (一條線可能比其他線更長)。 –