2013-02-06 64 views
0

我有一個java程序,它將一些文件提取到客戶端機器上。我已經實現了4個線程來提取文件。但是線程實現幾乎不影響提取時間。我已經在jvisualvm中檢查了線程的執行情況,它看起來很好,我確信線程是以並行方式實現的。這裏是我的系統配置...如何檢查Java程序中的線程是按順序還是並行運行?

Windows XP,Core2duo,3GB RAM。 java-vm-args:-Xmx512M -Xss2M。 我已經打印可用的處理器到正在運行的JVM ... Runtime.getRuntime()。availableProcessors()= 1(如果我沒有錯,它應該執行2個邏輯線程)。

我錯過了什麼嗎?我們如何確保線程在硬件級別平行運行?

+0

瓶頸可能是磁盤IO(而不是線程中的處理時間)。你檢查了嗎? –

+0

你可以在你的主線程中檢查.isAlive()(或者你不相信這個,使用像processexplorer這樣的外部應用程序)。請記住,每個物理磁盤只能使用1個讀取線程,否則您可能會創建更多開銷並使用更多線程減慢進程。 – andrew

+0

感謝您的回答。 @Ignacio,我們如何檢查瓶頸是磁盤IO。 – Bala

回答

0

並行執行有助於CPU出現瓶頸時。在你的情況下,瓶頸可能是I/O,而不是CPU。另外,你有一個超線程物理核心。在這種情況下,即使CPU處於瓶頸狀態,並行執行也無濟於事。此外,在某些情況下,雙線程應用程序在單核,超線程CPU上可能比單線程應用程序慢。超線程主要是營銷手段。不要依賴它。

0

您缺少的是提取時間不僅包含CPU時間,還包括HDD讀取和寫入。這兩個時間比CPU執行的ZIP算法多花幾個數量級。

+0

有沒有什麼辦法單獨檢查硬盤的讀/寫時間,只是爲了測試... – Bala

1

如何確保線程在硬件級別並行運行?

我認爲這大多是一個無效的問題。在Linux下,您可以通過ps -eLfl查看線程及其狀態,但這不適用於其他操作系統。線程轉儲將顯示線程狀態。通過jconsole中的Threads選項卡並單擊這些線程也會顯示它們的狀態。

但線程執行幾乎沒有影響提取時間

正如其他人所提到的,這是你的程序IO約束的教科書標誌。你所有的線程都在爭奪相同的IO資源,並將大部分時間花費在等待隊列中。

要測試此理論,請將您的應用程序移至更快的磁盤系統。固態硬盤是這裏的炸彈。將文件加載到內存中首先然後用不同數量的線程運行處理也將隔離IO帶寬問題。使用內存文件系統也是如此。

如果你處理的是IO綁定,那麼在沒有增加你的IO帶寬的情況下,可能沒有辦法加速它。

+1

+1'SSD是這裏的炸彈',特別是在標準旋轉器選擇低功耗和高性能耐用性的筆記本電腦上。 –

+0

謝謝格雷,我將我的應用程序移至4核心處理器,並將差異縮小了約四分之一。 – Bala

0

我不認爲有一種方法來檢查,除了通過外部手段;例如

  • 尋找Windows任務管理器性能圖表,或
  • VisualVM的連接到JVM。

我已經印刷可用處理器來運行的JVM:

Runtime.getRuntime().availableProcessors() = 1 

這意味着,你的JVM認爲它只有向它提供的1個處理器。如果您實際上有兩個物理內核(或HT虛擬內核),則操作系統只允許JVM使用其中的一個。

(某種在你的代碼的瓶頸不會導致availableProcessors()返回1。)


我們怎樣才能保證線程在硬件級並行運行?

您需要確保操作系統允許 JVM使用多個內核。

相關問題