Java 7 vs Groovy 2.1性能比较
自從我與Grails上一次接觸以來(lái),我已經(jīng)有兩年沒有使用Groovy了。 我陷入(硬)核心企業(yè)Java中,并且在后臺(tái)遇到了一些性能方面的問題。 我?guī)缀蹂e(cuò)過了學(xué)習(xí)Spock的機(jī)會(huì),但是幸運(yùn)的是, 華沙Java用戶組幫助我擺脫了一些舊系統(tǒng),恢復(fù)了正常的自我開發(fā)。 實(shí)際上,我希望Spock或Geb之類的框架能夠通過使它們更容易,更有效來(lái)改變編寫測(cè)試的方法。 這兩個(gè)框架都使用Groovy以及構(gòu)建工具中的新國(guó)王– Gradle 。 看到Groovy的速度如何影響我們的日常工作,我決定仔細(xì)研究它的性能,并將其與Java 7進(jìn)行比較。
我的測(cè)試環(huán)境基于Java 1.7.0_25和Groovy 2.1.6。 和以往一樣,我在1.0-beta-1版本(幾乎穩(wěn)定)中使用了Caliper ,并準(zhǔn)備了許多(我希望)具有代表性的微基準(zhǔn)。
基于Fork / Join框架的第一個(gè)基準(zhǔn)測(cè)試在兩種語(yǔ)言中應(yīng)該是最相似的,因?yàn)樗褂昧艘恍┍緳C(jī)機(jī)制。 我的測(cè)試使用一些隨機(jī)的int數(shù)據(jù)初始化了數(shù)組,然后使用框架查找數(shù)組中的最大元素。 在Groovy中,我的計(jì)算函數(shù)如下所示:
@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版本當(dāng)然非常相似。 經(jīng)過十幾分鐘的測(cè)量,我得到了非常可喜的結(jié)果:Groovy僅慢了8倍。
現(xiàn)在是時(shí)候在日常開發(fā)中檢查一些更現(xiàn)實(shí)的情況了。 我選擇了簡(jiǎn)單的POJO / POGO(是的),并進(jìn)行了一些簡(jiǎn)單的操作,只是為了確保JIT不會(huì)消除我的代碼(相信我,他喜歡這樣做)。 Groovy中我的偽“業(yè)務(wù)邏輯”方法:
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版本的主要區(qū)別在于POJO構(gòu)造函數(shù)中的getter和手動(dòng)String boxing。 在閱讀新聞上又花了十幾分鐘時(shí)間,而這一次Groovy僅慢了7倍
最后的測(cè)試應(yīng)具有壓力,并在更復(fù)雜的計(jì)算中檢查兩種語(yǔ)言。 我下定決心,選擇了快速排序算法。 循環(huán)很少,如果if語(yǔ)句不起作用。 我不會(huì)在此處復(fù)制粘貼,因?yàn)檫@是眾所周知的解決方案。 值得一提的是計(jì)時(shí)結(jié)果,幾乎是Groovy的5倍! 但是我已經(jīng)進(jìn)行了一些谷歌搜索,并注意到Groovy 2.0引入了@CompileStatic批注,這應(yīng)該給我們帶來(lái)一些額外的性能提升。 因此,讓我們檢查一下……是的,通過靜態(tài)編譯,Java的優(yōu)勢(shì)下降到了220%。
在下表中,您可以找到詳細(xì)的結(jié)果。 總結(jié)一下–我不確定在關(guān)鍵任務(wù)功能中使用Groovy是個(gè)好主意,但絕對(duì)是實(shí)現(xiàn)測(cè)試,原型設(shè)計(jì)等的絕佳解決方案。讓我強(qiáng)調(diào)一下,在Caliovy中編寫Caliper的結(jié)果解析器大約需要6行(解析json,迭代測(cè)量并計(jì)算平均值)
性能比較
| 叉/連接 | 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
總結(jié)
以上是生活随笔為你收集整理的Java 7 vs Groovy 2.1性能比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用签名保护基于HTTP的API
- 下一篇: 深入了解Java 8中的可选类API