我知道有很多因素會影響Java程序的運行時間。我試圖消除其中的一些,其中包括:什麼可能會導致並行Java程序運行時間差異很大?
- 預熱運行被考慮並且不計算在內。
System.gc()
在任何兩次運行之間調用。
但我發現數據仍然變化很大。下面是當使用10個線程的例子:
157th run
0 run time: 9106171
1 run time: 9084652
2 run time: 8990820
3 run time: 8989474
5 run time: 9062850
4 run time: 9302010
9 run time: 9454475
8 run time: 9506585
7 run time: 9494990
6 run time: 9491779
total time: 31 ms
158th run
2 run time: 14754858
5 run time: 14865035
0 run time: 15759180
1 run time: 15988056
3 run time: 16660592
8 run time: 16340240
9 run time: 16544479
6 run time: 17280122
7 run time: 17249778
4 run time: 18026322
total time: 19 ms
我發現多數奔跑,他們把像17〜20毫秒,但對於< 5%運行時,他們採取了類似25〜31毫秒。更有趣的是,在後面的情況下,每個線程的運行時間甚至更短,更短!
該程序的主線程只有start()
和join()
的線程,並且沒有更多的工作要做。
任何人都可以提供一些想法/提示?
這些線程究竟在做什麼? –
第一次猜測:JIT熱身。第二個猜測:GC(隨着對象的積累,並被掃除)。你已經涵蓋了這些。建議:1)剖析應用程序,2)觀察運行時的堆行爲 – paulsm4
@DavidSchwartz基本上,每個線程處理一個字符串段並生成一個樹數據結構。 – JackWM