假设我有一个具有签名的方法
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)
Run Code Online (Sandbox Code Playgroud)
版本2:我直接使用GroovyObject提供的getProperty方法
value = objet.getProperty(propertyName)
Run Code Online (Sandbox Code Playgroud)
巫婆一个有更好的表现?
想 : )
我们可以测试它以找出使用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"
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以定义一个我们要测试的类:
class Test {
String name = 'tim'
}
def o = new Test()
Run Code Online (Sandbox Code Playgroud)
然后我们可以在所有4个不同版本上运行基准测试:
benchmark {
'method1' {
method1( o, 'name' )
}
'method2' {
method2( o, 'name' )
}
'method3' {
method3( o, 'name' )
}
'method4' {
method4( o, 'name' )
}
}.prettyPrint()
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这打印出来:
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
Run Code Online (Sandbox Code Playgroud)
所以,最快的是getProperty一个,然后是object."$propertyName"一个,然后是你的version 1方法的较短版本,接着是你的原始(和最慢)版本1代码
但是,我认为这method4更容易阅读,所以你不得不问是否值得略微下降的表现
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |