1

假设我有一个签名的方法

def myAction(object,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)

女巫一号有更好的表现?

认为 : )

4

1 回答 1

6

我们可以使用 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更容易阅读,因此您必须询问性能略有下降是否值得

于 2013-08-22T09:11:02.703 回答