我知道有很多因素会影响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