Tôi luôn chọn phương pháp thứ hai (sử dụng mẫu GString), mặc dù khi có nhiều hơn một vài tham số như bạn có, tôi có xu hướng gộp chúng lại ${X}
vì tôi thấy nó làm cho nó dễ đọc hơn.
Chạy một số điểm chuẩn (sử dụng mô-đun GBench tuyệt vời của Nagai Masato ) trên các phương pháp này cũng cho thấy tạo khuôn mẫu nhanh hơn các phương pháp khác:
@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 ) {
// Just add the strings
'String adder' {
foo + bar + baz
}
// Templating
'GString template' {
"$foo$bar$baz"
}
// I find this more readable
'Readable GString template' {
"${foo}${bar}${baz}"
}
// StringBuilder
'StringBuilder' {
new StringBuilder().append( foo )
.append( bar )
.append( baz )
.toString()
}
'StringBuffer' {
new StringBuffer().append( foo )
.append( bar )
.append( baz )
.toString()
}
}.prettyPrint()
Điều đó cho tôi kết quả sau trên máy của tôi:
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
Vì vậy, với khả năng đọc và tốc độ có lợi, tôi khuyên bạn nên tạo khuôn mẫu ;-)
NB: Nếu bạn thêm toString()
vào cuối các phương pháp GString để làm cho loại đầu ra giống với các số liệu khác và làm cho nó trở thành một bài kiểm tra công bằng hơn StringBuilder
và StringBuffer
đánh bại các phương pháp GString về tốc độ. Tuy nhiên, vì GString có thể được sử dụng thay cho Chuỗi cho hầu hết mọi thứ (bạn chỉ cần thận trọng với các phím Bản đồ và câu lệnh SQL), nó hầu như có thể được để lại mà không cần chuyển đổi cuối cùng này
Thêm các bài kiểm tra này (như nó đã được yêu cầu trong các nhận xét)
'GString template toString' {
"$foo$bar$baz".toString()
}
'Readable GString template toString' {
"${foo}${bar}${baz}".toString()
}
Bây giờ chúng tôi nhận được kết quả:
String adder 514
GString template 267
Readable GString template 269
GString template toString 478
Readable GString template toString 480
StringBuilder 321
StringBuffer 369
Vì vậy, như bạn có thể thấy (như tôi đã nói), nó chậm hơn StringBuilder hoặc StringBuffer, nhưng vẫn nhanh hơn một chút so với việc thêm String ...
Nhưng vẫn có thể đọc được nhiều hơn.
Chỉnh sửa sau khi bình luận bởi Ruralcoder bên dưới
Đã cập nhật lên gbench mới nhất, các chuỗi lớn hơn để nối và kiểm tra với StringBuilder được khởi tạo ở kích thước tốt:
@Grab( 'org.gperfutils:gbench:0.4.2-groovy-2.1' )
def (foo,bar,baz) = [ 'foo' * 50, 'bar' * 50, 'baz' * 50 ]
benchmark {
// Just add the strings
'String adder' {
foo + bar + baz
}
// Templating
'GString template' {
"$foo$bar$baz"
}
// I find this more readable
'Readable GString template' {
"${foo}${bar}${baz}"
}
'GString template toString' {
"$foo$bar$baz".toString()
}
'Readable GString template toString' {
"${foo}${bar}${baz}".toString()
}
// StringBuilder
'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()
cho
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()
gắn vào hai bài kiểm tra GString. Cuộc chạy của tôi cho thấy rằng họ sau đó thực hiện gần như giống nhưString adder
. Tôi đoán là bài kiểm tra bạn đã chạy không thực sự xử lý việc nối, vì vậy nó chỉ tạo một đối tượng GString và lưu trữ các tham chiếu.StringBuilder
vẫn là nhanh nhất, bỏ qua, nếu bạn cần mộtString
lúc nào đó.