2011-11-15 48 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))))) 

请问你的机器上这项工作呢?

相关问题