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