groovy getProperty()方法的性能问题

时间:2013-08-22 08:51:26

标签: groovy

假设我有一个像

这样的签名的方法

def myAction(objet,String propertyName);

我只是想从objet中检索属性值,我写了两个版本

版本1:我构造了getter方法并在objet上调用它

    original = propertyName
    prefix = original.substring(0,1).toUpperCase()
    suffix = original.substring(1,original.length())
    methodName = new StringBuilder('get').append(prefix).append(suffix).toString()
    value = domain.metaClass.invokeMethod(objet,methodName,null)

版本2:我直接使用GroovyObject提供的getProperty方法

value = objet.getProperty(propertyName)

女巫有更好的表现吗?

认为:)

1 个答案:

答案 0 :(得分:6)

我们可以测试它以找出using GBench ...

我想出了4种不同的方法:

@Grab( 'org.gperfutils:gbench:0.4.2-groovy-2.1' )

// Your 'version 1' method
def method1( object, String propertyName ) {
    original = propertyName
    prefix = original.substring(0,1).toUpperCase()
    suffix = original.substring(1,original.length())
    methodName = new StringBuilder('get').append(prefix).append(suffix).toString()
    assert 'tim' == object.metaClass.invokeMethod(object,methodName,null)
}

// Your 'version 2' method
def method2( object, String propertyName ) {
    assert 'tim' == object.getProperty( propertyName )
}

// The same as method 1, but more Groovy
def method3( object, String propertyName ) {
    assert 'tim' == object.metaClass.invokeMethod( object, "get${propertyName.capitalize()}",null)
}

// And get the property with the Groovy String templating
def method4( object, String propertyName ) {
    assert 'tim' == object."$propertyName"
}

然后我们可以定义一个我们要测试的类:

class Test {
    String name = 'tim'
}

def o = new Test()

然后我们可以在所有4个不同版本上运行基准测试:

benchmark {
    'method1' {
        method1( o, 'name' )
    }
    'method2' {
        method2( o, 'name' )
    }
    'method3' {
        method3( o, 'name' )
    }
    'method4' {
        method4( o, 'name' )
    }
}.prettyPrint()

在我的机器上打印出来:

Environment
===========
* Groovy: 2.1.6
* JVM: Java HotSpot(TM) 64-Bit Server VM (23.25-b01, Oracle Corporation)
    * JRE: 1.7.0_25
    * Total Memory: 255.125 MB
    * Maximum Memory: 1095.125 MB
* OS: Mac OS X (10.8.4, x86_64)

Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On

         user  system   cpu  real

method1  1630       7  1637  1648
method2   429       1   430   435
method3  1368       1  1369  1378
method4   629       1   630   637

所以,最快的是getProperty一个,然后是object."$propertyName"一个,接着是version 1方法的较短版本,接着是原始(和最慢)版本1代码

但是,我认为method4更容易阅读,所以你不得不问性能是否值得轻微下降