2011-11-15 49 views
3

我在問這個問題,找出爲什麼我的運行時計數增加。爲什麼中止線程數也增加時運行時間計數會增加?

我有一個簡單的程序,它有一個引用數字的向量和一羣線程同時嘗試寫入向量中的一個數字。

通過修改向量的大小(在程序中稱爲直方圖),我可以減少中止事務的數量,因爲對於較大的向量大小,寫入集不會發生衝突。程序中的大小稱爲「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) 
+0

我認爲你需要看看每個線程正在使用多長時間 - 嘗試計算最小值,最大值和平均時間。 (一條線可能比其他線更長)。 –

回答

0

當你有少可放棄的號碼,然後該線程將運行更多的「循環」,因此需要更多的時間來完成他們即會處理更多的「計數器」的數量。而當由於你的catch塊中的throw更多異常時,線程將中止,因此線程的退出速率將更高,因此它們將處理更少的「計數器」並且花費更少的時間。

+0

我認爲這是不對的。即使我刪除了try/catch,我也看到了同樣的問題。 – Timoteo

2

也許它只是JVM運行時優化的問題。第一次運行可能需要更長的時間,但是已經連續運行了嗎?我從增加5000 histogram向量的大小至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))))) 

請問你的機器上這項工作呢?

相關問題