4

我試圖更改報表的執行,有它在併發完成。在'serail模式'中,執行測試需要30秒,當使用併發模式時,我需要27秒(考慮到必須採取幾個步驟才能完成結果)。爲什麼增加newFixedThreadPool導致性能較差?

,我還沒有得到的東西是這一行:

ExecutorService executor = Executors.newFixedThreadPool(4); 

我的電腦裝備有2x2.6 GHz四核和我預料的執行時間會減少,如果是的newFixedThreadPool高(16)。實際上,我越增加newFixedThreadPool執行越慢。這引出了一個問題:我做錯了什麼或者我不明白什麼?!?!

我從嵌入我的執行2個結果截圖。

A. newSingleThreadExecuter - 在23秒

B.運行的newFixedThreadPool(4) - 在43秒運行。

每次我提出「工人」我得到的System.out的的currentTimeMillis和「fatched TKT」的結果是毫秒,它需要從數據庫中獲取數據。 (在戰略A - 它需要〜3ms和B到7ms)。

Stopper stopper = new Stopper(); 
    for (Long iNum : multimap.asMap().keySet()) 
    { 
     List<Long> tickets = (List<Long>) multimap.get(iNum); 
     for (Long ticketNumber : tickets) 
     { 
       pojoPks = getPkData(iNum); 
       Callable<PojoTicket> worker = new MaxCommThread(ticketNumber, pojoPks); 
       Future<PojoTicket> submit = executor.submit(worker); 
       futures.add(submit); 
     } 
    } 

    System.out.println("futurues: " +futures.size()); 
    for (Future<PojoTicket> future : futures) 
    { 
     try 
     { 
      PojoTicket pojoTicket = future.get(); 
      //do the rest here 

     } catch (InterruptedException e) 
     { 
      System.out.println("---------------------->InterruptedException"); 
     } catch (ExecutionException e) 
     { 
      System.out.println("---------------------->ExecutionException"); 
     } 
    } 

    executor.shutdown(); 
    stopper.stop(); 

enter image description here

enter image description here

+1

呃。爲什麼你會得到如此多的'ExecutionException's? – Gray 2012-08-02 18:02:00

+0

你能發佈你的Worker類代碼嗎?這可能會給出更多的線索,看看發生了什麼。 – 2012-08-02 18:14:31

回答

5

我越增加的newFixedThreadPool較慢的執行

在一般情況下,如果添加線程工作,它不加快步伐,可能是因爲有兩個原因之一:

  • 每一份工作都對某種資源的同步,這樣他們都爭取鎖爭用,而不是獨立運行。

  • 的工作沒有太多的CPU工作要做。將線程添加到IO綁定進程不會讓事情變得更快,因爲IO通道可能已經最大化了。

但是,如果你的應用程序運行速度減半,這是一個有趣的情況。我只能猜測它是它們兩個的組合。

要做的一件事就是從1個線程開始,然後嘗試2個。如果運行速度不快,請首先查看作業之間共享的鎖。每個作業正在修改哪些併發集合或其他對象?嘗試減少鎖的數量或讓線程存儲臨時信息,然後鎖定一次以更新中央對象。

您還可以觀察系統統計信息,以查看您的IO通道是否已最大化。在這裏遇到一個常見問題。查看是否可以在內存磁盤上運行,以查看您的應用程序運行速度是否更快。這將是一個指標,你是IO界限。

最後,我會研究爲什麼當你獲得工作時,你會得到任何ExecutionException。這可能是其他問題的一個指標,但您應該首先了解這一點。

+1

根據你的回答,我深入研究了代碼並發現了問題:我有一個同步方法來創建問題。現在我需要看看如何改進這種方法並修復多線程問題。謝謝! – adhg 2012-08-03 14:46:42

+0

優秀@adhg。很高興我能幫上忙。 – Gray 2012-08-03 14:50:00

+0

@Gray你說過「磁盤是一個常見問題,看看你是否可以在內存磁盤上運行,看看你的應用程序運行速度是否快,這將表明你是IO綁定的。」你能解釋一下Disk的含義嗎? – Geek 2012-08-20 05:06:47

相關問題