假设我有一个像
这样的签名的方法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)
女巫有更好的表现吗?
认为:)
答案 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
更容易阅读,所以你不得不问性能是否值得轻微下降