2012-05-14 141 views
2

我的Java應用程序本質上是做這樣的:多線程應用程序的性能

  • 讀nThread緩衝區從文件(1 MB字節arryas)
  • 創建處理緩衝區
  • 等待線程來處理數據nThread線程
  • 寫入處理的數據到另一個文件

它是那些要達到一個應用中的一個理論上每個核心都有100%的速度提升,但相反,線程處理信息的速度越快,其獲得的SLOWER就越快!

例如:

  • 1螺紋:4800毫秒
  • 2線程:10200毫秒
  • 3個線程:13400毫秒
  • 4線程:18560毫秒
+3

你是否正在用多線程讀取文件? – Tudor

+0

您是否創建了很多新線程或重新使用它們? – Stephan

+1

你能告訴我們一個小代碼樣本:你是如何創建你的線程併發送線條給他們的? – Gray

回答

1

在添加線程時獲得這種性能意味着您正在做某件事真的錯了。通常添加線程不會提供任何速度改進,有時可能會懲罰你一點,但添加另一個線程並使程序運行時間加倍是非常不尋常的。

這裏有一些事情要調查:

  • 作爲@Tudor在評論中提到的,你應該從一個單獨的線程來讀取輸入文件,然後分派工作的工作線程。
  • 您應該考慮使用ExecutorService而不是自己管理自己的線程。這通常會刪除大量的用戶代碼和相關的錯誤。見Executors.newFixedThreadPool(numThread)
  • 你確定你開始線程正確嗎?您應該撥打new Thread(...).start(),而不是直接撥打run()
  • 你打電話join()之前你開始你的下一個線程?你應該所有的線程start(),發送線路給他們,然後join()最後。
  • 您是否有意將所有輸入行全部發送到所有線程?我不認爲這會顯示性能數字,除非你增加輸出IO。

如果您向我們展示您的問題中的一些線程代碼,我們可以提供更多幫助。

+0

是的,我正在用單個線程讀取和寫入文件。 – dosse91214

+0

我試着重複使用相同的線程並創建新的線程,最小變化的順序是<1ms – dosse91214

+0

我使用的是.start(),但不是.join(),因爲我如何管理線程,現在我將給出看看那個線程池,我會看看它是否有效。非常感謝 – dosse91214

0

沒有經過充分優化的代碼通常會佔用整個內存帶寬。在多核處理器上添加另一個使用相同未優化代碼的線程,它們將分離它們之間的帶寬,並且相當頻繁地進入對方,進一步放慢速度。

格雷說:「...加倍程序運行時間是非常不尋常的。」我不同意。這通常是在開始優化內存訪問之前在C代碼中發生的。我認爲從一開始就沒有看到減速是非常不尋常的。

我不知道抽樣是否適用於Java,但這是一個明顯的起點。