我的Java應用程序本質上是做這樣的:多線程應用程序的性能
- 讀nThread緩衝區從文件(1 MB字節arryas)
- 創建處理緩衝區
- 等待線程來處理數據nThread線程
- 寫入處理的數據到另一個文件
它是那些要達到一個應用中的一個理論上每個核心都有100%的速度提升,但相反,線程處理信息的速度越快,其獲得的SLOWER就越快!
例如:
- 1螺紋:4800毫秒
- 2線程:10200毫秒
- 3個線程:13400毫秒
- 4線程:18560毫秒
- 等
我的Java應用程序本質上是做這樣的:多線程應用程序的性能
它是那些要達到一個應用中的一個理論上每個核心都有100%的速度提升,但相反,線程處理信息的速度越快,其獲得的SLOWER就越快!
例如:
在添加線程時獲得這種性能意味着您正在做某件事真的錯了。通常添加線程不會提供任何速度改進,有時可能會懲罰你一點,但添加另一個線程並使程序運行時間加倍是非常不尋常的。
這裏有一些事情要調查:
ExecutorService
而不是自己管理自己的線程。這通常會刪除大量的用戶代碼和相關的錯誤。見Executors.newFixedThreadPool(numThread)
。new Thread(...).start()
,而不是直接撥打run()
。join()
之前你開始你的下一個線程?你應該所有的線程start()
,發送線路給他們,然後join()
最後。如果您向我們展示您的問題中的一些線程代碼,我們可以提供更多幫助。
是的,我正在用單個線程讀取和寫入文件。 – dosse91214
我試着重複使用相同的線程並創建新的線程,最小變化的順序是<1ms – dosse91214
我使用的是.start(),但不是.join(),因爲我如何管理線程,現在我將給出看看那個線程池,我會看看它是否有效。非常感謝 – dosse91214
沒有經過充分優化的代碼通常會佔用整個內存帶寬。在多核處理器上添加另一個使用相同未優化代碼的線程,它們將分離它們之間的帶寬,並且相當頻繁地進入對方,進一步放慢速度。
格雷說:「...加倍程序運行時間是非常不尋常的。」我不同意。這通常是在開始優化內存訪問之前在C代碼中發生的。我認爲從一開始就沒有看到減速是非常不尋常的。
我不知道抽樣是否適用於Java,但這是一個明顯的起點。
你是否正在用多線程讀取文件? – Tudor
您是否創建了很多新線程或重新使用它們? – Stephan
你能告訴我們一個小代碼樣本:你是如何創建你的線程併發送線條給他們的? – Gray