java流式传输对象_Java性能:面向教学与流式传输
java流式傳輸對象
在for循環中向上或向下計數是最有效的迭代方式嗎? 有時答案既不可行。 閱讀這篇文章,了解不同迭代品種的影響。
迭代性能
關于如何以高性能進行迭代有很多觀點。 Java中的傳統迭代方式是一個for循環,該循環從零開始,然后計數到一些預定義的數字:
private static final int ITERATIONS = 10_000;@Benchmark public int forUp() {int sum = 0;for (int i = 0; i < ITERATIONS; i++) {sum += i;}return sum; }有時,我們遇到一個for循環,該循環以預定的非負值開始,然后遞減計數。 這在JDK本身中非常普遍,例如在String類中。 這是通過遞減而不是遞增來解決先前問題的示例。
@Benchmark public int forDown() {int sum = 0;for (int i = ITERATIONS; i-- > 0;) {sum += i;}return sum; }我認為,這樣做的理由是,檢查值與零的關系可能比測試值與任何其他任意值的關系更有效。 實際上,我所知道的所有CPU都有機器碼指令,可以檢查給定值與零的關系。 另一個想法是,上面給出的遞減計數習慣似乎只檢查一次循環變量(它同時檢查值,然后減小它),而不是頂部的常規示例。 我懷疑這對當今高效的JIT編譯器影響很小或沒有影響,后者將能夠像優化第二個迭代一樣優化第一個迭代。 當代碼在解釋模式下運行時,可能會產生影響,但是本文中未對此進行檢查。
另一種方法是使用
IntStream看起來像這樣:
如果大型迭代需要更高的性能,則只需在流中添加.parallel()運算符就可以使流并行變得相對容易。 本文未對此進行檢查。
Graal VM下的性能
在我的筆記本電腦(MacBook Pro,2015年中,2.2 GHz Intel Core i7)上的GraalVM(rc-11,以及GraallVM附帶的新C2編譯器)下運行這些測試可以得出以下結果:
Benchmark Mode Cnt Score Error Units ForBenchmark.forDown thrpt 5 311419.166 ± 4201.724 ops/s ForBenchmark.forUp thrpt 5 309598.916 ± 12998.579 ops/s ForBenchmark.stream thrpt 5 312360.089 ± 8291.792 ops/s對于流解決方案是最快的解決方案(盡管其誤差在誤差范圍內),這可能會讓某些人感到意外。
在上一篇文章中 ,我介紹了與傳統命令式代碼相比,流和聲明式編程在代碼度量方面的一些優勢。 我尚未測試過冷代碼段的性能(即在JIT啟動之前)。
聰明的數學
從數學上,我們記得從零開始的連續數字的總和為N *(N + 1)/ 2,其中N是序列中的最高數字。 運行此基準測試:
@Benchmark public int math() {return ITERATIONS * (ITERATIONS + 1) / 2; }使我們的性能比以前的實現提高了1000倍以上:
Benchmark Mode Cnt Score Error Units ForBenchmark.math thrpt 5 395561077.984 ± 11138012.141 ops/s迭代次數越多,收益越大。 聰明有時會勝過蠻力。
超快速數據流
借助Speedment HyperStream,可以從數據庫獲得類似的性能。 在HyperStream上信息 。
結論
在某些常用的硬件/ JVM上,無論我們在for循環中向上還是向下進行迭代都沒有關系。 較新的JVM能夠優化流迭代,因此與for循環相比,它們具有同等甚至更好的性能。
在我看來,與for循環相比,流代碼通常更具可讀性,因此,我相信流在某些將來可能是事實上的迭代發明。
使用Speedment HyperStream可以高性能地流式傳輸數據庫內容。
翻譯自: https://www.javacodegeeks.com/2019/09/java-performance-for-eaching-vs-streaming.html
java流式傳輸對象
總結
以上是生活随笔為你收集整理的java流式传输对象_Java性能:面向教学与流式传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑图片音乐制作软件下载(图片歌曲制作软
- 下一篇: 虚拟视频设置(手机虚拟视频设置方法)