Her zaman ikinci yöntemi tercih ederim (GString şablonunu kullanarak), yine de sizin gibi birkaç parametreden daha fazlası olduğunda, onları ${X}
daha okunaklı hale getirdiği için bunları sarmalama eğilimindeyim .
Bu yöntemlerde bazı kıyaslamaları çalıştırmak ( Nagai Masato'nun mükemmel GBench modülünü kullanarak ), şablonlamanın diğer yöntemlerden daha hızlı olduğunu da gösterir:
@Grab( 'com.googlecode.gbench:gbench:0.3.0-groovy-2.0' )
import gbench.*
def (foo,bar,baz) = [ 'foo', 'bar', 'baz' ]
new BenchmarkBuilder().run( measureCpuTime:false ) {
'String adder' {
foo + bar + baz
}
'GString template' {
"$foo$bar$baz"
}
'Readable GString template' {
"${foo}${bar}${baz}"
}
'StringBuilder' {
new StringBuilder().append( foo )
.append( bar )
.append( baz )
.toString()
}
'StringBuffer' {
new StringBuffer().append( foo )
.append( bar )
.append( baz )
.toString()
}
}.prettyPrint()
Bu bana makinemde şu çıktıyı veriyor:
Environment
===========
* Groovy: 2.0.0
* JVM: Java HotSpot(TM) 64-Bit Server VM (20.6-b01-415, Apple Inc.)
* JRE: 1.6.0_31
* Total Memory: 81.0625 MB
* Maximum Memory: 123.9375 MB
* OS: Mac OS X (10.6.8, x86_64)
Options
=======
* Warm Up: Auto
* CPU Time Measurement: Off
String adder 539
GString template 245
Readable GString template 244
StringBuilder 318
StringBuffer 370
Okunabilirlik ve hız lehine, şablonlamayı tavsiye ederim ;-)
Not: Eğer eklerseniz toString()
çıkış diğer ölçümlere aynı tip yapmak gstring yöntemlerin sonuna kadar ve daha adil bir testi yapmak, StringBuilder
ve StringBuffer
hız için gstring yöntemleri yendi. Bununla birlikte, GString çoğu şey için String yerine kullanılabileceğinden (sadece Harita anahtarları ve SQL ifadeleri ile dikkatli olmanız gerekir), çoğunlukla bu son dönüştürme olmadan bırakılabilir.
Bu testleri eklemek (yorumlarda sorulduğu gibi)
'GString template toString' {
"$foo$bar$baz".toString()
}
'Readable GString template toString' {
"${foo}${bar}${baz}".toString()
}
Şimdi sonuçları alıyoruz:
String adder 514
GString template 267
Readable GString template 269
GString template toString 478
Readable GString template toString 480
StringBuilder 321
StringBuffer 369
Gördüğünüz gibi (dediğim gibi), StringBuilder veya StringBuffer'dan daha yavaştır, ancak yine de Strings eklemekten biraz daha hızlıdır ...
Ama yine de çok daha okunabilir.
Aşağıdaki kırsal kodlayıcı tarafından yapılan yorumdan sonra düzenleyin
En son gbench, birleştirme için daha büyük dizeler ve iyi bir boyuta başlatılmış bir StringBuilder ile bir test ile güncellendi:
@Grab( 'org.gperfutils:gbench:0.4.2-groovy-2.1' )
def (foo,bar,baz) = [ 'foo' * 50, 'bar' * 50, 'baz' * 50 ]
benchmark {
'String adder' {
foo + bar + baz
}
'GString template' {
"$foo$bar$baz"
}
'Readable GString template' {
"${foo}${bar}${baz}"
}
'GString template toString' {
"$foo$bar$baz".toString()
}
'Readable GString template toString' {
"${foo}${bar}${baz}".toString()
}
'StringBuilder' {
new StringBuilder().append( foo )
.append( bar )
.append( baz )
.toString()
}
'StringBuffer' {
new StringBuffer().append( foo )
.append( bar )
.append( baz )
.toString()
}
'StringBuffer with Allocation' {
new StringBuffer( 512 ).append( foo )
.append( bar )
.append( baz )
.toString()
}
}.prettyPrint()
verir
Environment
===========
* Groovy: 2.1.6
* JVM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01, Oracle Corporation)
* JRE: 1.7.0_21
* Total Memory: 467.375 MB
* Maximum Memory: 1077.375 MB
* OS: Mac OS X (10.8.4, x86_64)
Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On
user system cpu real
String adder 630 0 630 647
GString template 29 0 29 31
Readable GString template 32 0 32 33
GString template toString 429 0 429 443
Readable GString template toString 428 1 429 441
StringBuilder 383 1 384 396
StringBuffer 395 1 396 409
StringBuffer with Allocation 277 0 277 286
.toString()
iki GString testine eklenmiş olarak yeniden çalıştırmalısınız . Koşum, daha sonra neredeyse aynı performans gösterdiklerini gösteriyorString adder
. Tahminimce, çalıştırdığınız test aslında birleştirme işlemini ele almıyor, bu yüzden sadece bir GString nesnesi oluşturup referansları depoluyor.StringBuilder
hala en hızlısı, birString
noktada ihtiyacınız varsa, eller aşağı .