2013-05-12 55 views
2

我和Groovy代碼的下面的代碼片段一些意想不到的基準測試結果:Groovy的invokedynamic性能

class A{ 
    def n(){ 
     return 1 
    } 
} 
class B{ 
    def n(){ 
     return 2 
    } 
} 
class C{ 
    def n(){ 
     return 3 
    } 
} 
class D{ 
    def n(){ 
     return 4 
    } 
} 

def bench(loops){ 
    def a = new A() 
    def b = new B() 
    def c = new C() 
    def d = new D() 
    def ret=0 
    for(i=0; i<loops; i++){ 
     ret = ret + getN(a) + getN(b) + getN(c) + getN(d) 
    } 
    return ret 
} 

def getN(clazz){ 
    return clazz.n() 
} 

我不得不說,我使用的編譯的類文件,並與反射API調用它。講述很長的故事(不要問;)。對於第一印象,我用10回合+5熱身10000迴路。 (junit-benchmark框架) 我的JDK是Verison 1.7.0_09,我使用Groovy 2.1。 我編譯了代碼2次,並且沒有invokedynamic支持。 關鍵是,與invokedynamic的基準比正常編譯的要長得多。 我也做了其他斐波那契數的基準,其行爲像預期的一樣(indy花費了大約一半的時間)。

有人知道這裏有什麼問題嗎?

謝謝。

+0

有沒有可能Groovy,特別是java編譯器,可以內聯添加? – Thorben 2013-05-26 17:39:56

回答

1

我並不是Groovy的專家,但我有一個印象,我讀過Groovy創造類似「上帝階級」的地方。該類包含Groovy源代碼中出現的所有方法,而子類僅覆蓋某些方法。製作這樣的類允許進行通常的invokevirtual調用而不是動態查找。這可能是對經濟放緩的解釋。

嘗試一些方法的運行時注入來打斷Groovy的靜態分析並強制編譯器輸出動態查找代碼。

+0

我嘗試了http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/中的Groovycode。 invokedynamic Performance表現更好。在該基準中,對象更復雜。如果有人可以用'神模塊'來確認你的論文,我將問題標記爲已解決。 – Thorben 2013-06-27 20:07:37