groovy 2.5.4_Java 7 vs Groovy 2.1性能比较
groovy 2.5.4
自從我與Grails上一次接觸以來,我已經有兩年沒有使用Groovy了。 我陷入(硬)核心企業Java中,但在后臺遇到了一些性能方面的問題。 我幾乎錯過了學習Spock的機會,但是幸運的是, 華沙Java用戶組幫助我擺脫了一些舊系統,恢復了正常的自我開發。 實際上,我希望Spock或Geb之類的框架能夠通過使它們更容易,更有效來改變編寫測試的方法。 這兩個框架都使用Groovy以及構建工具中的新國王– Gradle 。 看到Groovy的速度如何影響我們的日常工作,我決定仔細研究它的性能,并將其與Java 7進行比較。
我的測試環境基于Java 1.7.0_25和Groovy 2.1.6。 像往常一樣,我在1.0-beta-1版本(幾乎穩定)中使用了Caliper ,并準備了許多(我希望)具有代表性的微基準。
基于Fork / Join框架的第一個基準測試在兩種語言中應該是最相似的,因為它使用了一些本機機制。 我的測試使用一些隨機的int數據初始化了數組,然后使用框架在數組中找到最大的元素。 在Groovy中,我的計算函數如下所示:
@Override Integer compute() {def size = end - startif (size == 1) {Math.max(array[start], array[end])} else {int diff = size / 2MaxValueSeeker left = new MaxValueSeeker(array, start, start + diff)left.fork()MaxValueSeeker right = new MaxValueSeeker(array, start + diff, end)Math.max(right.compute(), left.join())} }Java版本當然非常相似。 經過十幾分鐘的測量,我得到了非常可觀的結果:Groovy僅慢了8倍。
現在是時候在日常開發中檢查一些更現實的時候了。 為了確保JIT不會消除我的代碼(我相信他喜歡做這樣的笑話),我選擇了簡單的POJO / POGO(是的),并進行了一些簡單的操作。 我在groovy中的偽“業務邏輯”方法:
def int proceed(int reps) {List<GroovyPojo> list = new ArrayList<>()int sum = 0;reps.times {// first param is int and second is Stringlist.add(new GroovyPojo(value: it, stringValue: it))}list.each {if (Integer.parseInt(it.stringValue) == it.value) {sum += it.value}}sum }Java版本的主要區別在于POJO構造函數中的getter和手動String boxing。 在閱讀新聞上又花了十幾分鐘的時間……這次,Groovy僅慢了7倍
最后的測試應具有壓力,并在更復雜的計算中檢查兩種語言。 我下定決心,選擇了快速排序算法。 循環很少,如果if語句不起作用。 我不會在這里復制粘貼它,因為這是眾所周知的解決方案。 值得一提的是計時結果,幾乎是Groovy的5倍! 但是我已經進行了一些谷歌搜索,并注意到Groovy 2.0引入了@CompileStatic批注,這應該給我們帶來一些額外的性能提升。 因此,讓我們檢查一下……是的,通過靜態編譯,Java的優勢下降到了220%。
在下表中,您可以找到詳細的結果。 總結一下–我不確定在關鍵任務功能中使用Groovy是個好主意,但絕對是實現測試,原型設計等的絕佳解決方案。讓我強調一下,在Caliovy中編寫Caliper的結果解析器大約需要6行(解析json,迭代測量并計算平均值)
性能比較
| 叉/連接 | 22.132 | 181.018 | 8.18 |
| 波霍斯 | 117.914 | 856.337 | 7.26 |
| 快速排序 | 68.728 | 330.159 | 4.80 |
| 使用@CompileStatic的Quicksort | 67.752 | 147.792 | 2.18 |
翻譯自: https://www.javacodegeeks.com/2013/09/java-7-vs-groovy-2-1-performance-comparison.html
groovy 2.5.4
總結
以上是生活随笔為你收集整理的groovy 2.5.4_Java 7 vs Groovy 2.1性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借助Web技术,桌面用户界面将保持活跃
- 下一篇: Java 10迁移建议