![]() |
1
3
从代码示例来看,时间测量方法接近于微观基准测试,对于微观基准测试而言,简单地测量单个执行的时间是误导性的。 您可以在下面的stackoverflow post中看到它的详细讨论: How do I write a correct micro-benchmark in Java? 我已经编写了一个更精确的基准来获得对您的示例代码更精确的度量。代码运行在具有多线程的四核i7上(但它是一台笔记本电脑,由于电源和热量管理,结果可能会稍微偏向于产生更多热量的多线程代码)。
这是结果 Benchmark (size) Mode Cnt Score Error Units PerfTest.testManualThreading 100 thrpt 6 95971,811 ± 1100,589 ops/s PerfTest.testManualThreading 1000 thrpt 6 76293,983 ± 1632,959 ops/s PerfTest.testManualThreading 10000 thrpt 6 34630,814 ± 2660,058 ops/s PerfTest.testManualThreading 100000 thrpt 6 5956,552 ± 529,368 ops/s PerfTest.testParallelStream 100 thrpt 6 69965,462 ± 451,418 ops/s PerfTest.testParallelStream 1000 thrpt 6 59968,271 ± 774,859 ops/s PerfTest.testParallelStream 10000 thrpt 6 29079,957 ± 513,244 ops/s PerfTest.testParallelStream 100000 thrpt 6 4217,146 ± 172,781 ops/s PerfTest.testSequentialFor 100 thrpt 6 3553930,640 ± 21142,150 ops/s PerfTest.testSequentialFor 1000 thrpt 6 356217,937 ± 7446,137 ops/s PerfTest.testSequentialFor 10000 thrpt 6 28894,748 ± 674,929 ops/s PerfTest.testSequentialFor 100000 thrpt 6 1725,735 ± 13,273 ops/s 所以顺序版本看起来 方式 速度快到几千个元素,它们可以与10公里之前的手动线程和10公里之后的并行流相媲美,线程代码从那时起性能更好。 考虑到编写“手动线程变量”所需的代码量,以及在那里创建错误的风险,或者由于计算批大小而导致效率低下,我可能不会选择该选项,即使它看起来可能比大型列表的流速度更快。 我不会尝试先进行排序,然后进行二进制搜索,因为过滤是一个O(N)操作,然后对O(nlog(N))进行排序(在上面必须添加一个二进制搜索)。所以,除非您对数据有一个非常精确的模式,否则我看不到它对您有利。 要知道,虽然不能得出结论,但这个基准不能支持。一方面,它基于这样一个假设:过滤是程序中唯一发生的事情,并且为CPU时间而战。如果您使用的是任何类型的“多用户”应用程序(例如Web应用程序),那么这可能不是真的,并且您很可能会失去通过多线程获得的一切。 |
![]() |
2
2
自Java 8以来,您可以使用流来解决以下问题:
我建议你 this reading 看看 this question 了解并行性是否对您有帮助。 |
|
user29759326 · 如何返回递归函数中的最后一个值? 4 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 4 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 4 月前 |
![]() |
rudraraj · java中未声明最终变量 5 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 5 月前 |