【发布时间】:2014-08-10 08:29:32
【问题描述】:
我正在玩 java 1.8。 我读到新的集合 api 工作得更快,因为 它在并行的数据结构上运行操作。
我想看看这种努力。 所以我写了以下代码:
public static void main(String[] args) {
ArrayList<SamplePerson> persons = new ArrayList<>();
for (long i = 0; i < 10000000; i++) {
persons.add(new SamplePerson(EyeColour.BLUE,20,"Max Musterman",Gender.MALE));
}
long nsBefore = System.nanoTime();
// using the new collection api - parallel way??
persons.forEach(samplePerson -> samplePerson.setAge(22));
// sequential way
for(int i = 0; i < persons.size(); i++){
persons.get(i).setAge(22);
}
long nsAfter = System.nanoTime();
long runtime = nsAfter - nsBefore;
System.out.println("Time in Nanoseconds: " + runtime);
}
我的处理器:i7-2600 CPU
使用“并行”方式的结果: 纳秒时间:74836825
使用顺序方式的结果: 以纳秒为单位的时间:45071315
每个人都可以解释一下这个结果吗? 设置这种威胁的开销有那么高吗? 我有点困惑,请帮助我:-)
【问题讨论】:
-
请出示您的序列码。
-
How do I write a correct micro-benchmark in Java? 的可能副本。我的意思是:Java 中的基准测试很难,幼稚的方法被认为是失败的。
-
顺便说一下,
forEach()的默认实现(以及ArrayList实现)只是一个常规的 for-each 循环,所以(如下所述)它可能不是并行。 -
在 Jigar Joshi:感谢您的快速回复。这似乎是解决方案。现在我使用了并行 Stream 并启动了一个预热阶段(我在测量之前运行了一堆循环)。结果:使用并行方式的结果:以纳秒为单位的时间:41721340。使用顺序方式的结果:以纳秒为单位的时间:maaartinus 的 43841863:我注意到 java 中的基准测试并不像我想象的那么容易。所以我猜这个测量是'根本不是很有代表性。
标签: java performance collections arraylist java-8