ฉันมักจะใช้วิธีที่สองเสมอ (โดยใช้เทมเพลต GString) แม้ว่าจะมีพารามิเตอร์มากกว่าสองตัวเช่นคุณฉันมักจะรวมไว้ใน${X}
ขณะที่ฉันพบว่ามันทำให้อ่านได้ง่ายขึ้น
การใช้เกณฑ์มาตรฐาน (โดยใช้โมดูล GBench ที่ยอดเยี่ยมของNagai Masato ) ในวิธีการเหล่านี้ยังแสดงให้เห็นว่าการทำเทมเพลตนั้นเร็วกว่าวิธีอื่น ๆ :
@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()
ที่ให้ผลลัพธ์ต่อไปนี้บนเครื่องของฉัน:
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
ดังนั้นด้วยความสามารถในการอ่านและความเร็วฉันขอแนะนำให้ใช้เทมเพลต ;-)
หมายเหตุ: หากคุณเพิ่มtoString()
ในส่วนท้ายของวิธีการ GString เพื่อให้ประเภทเอาต์พุตเหมือนกับเมตริกอื่น ๆ และทำการทดสอบที่เป็นธรรมStringBuilder
และStringBuffer
เอาชนะวิธีการ GString เพื่อความเร็ว อย่างไรก็ตามเนื่องจาก GString สามารถใช้แทน String สำหรับสิ่งต่างๆได้มากที่สุด (คุณเพียงแค่ต้องใช้ความระมัดระวังกับคีย์แผนที่และคำสั่ง SQL) ส่วนใหญ่จะถูกปล่อยไว้โดยไม่มีการแปลงขั้นสุดท้ายนี้
การเพิ่มการทดสอบเหล่านี้ (ตามที่ถามในความคิดเห็น)
'GString template toString' {
"$foo$bar$baz".toString()
}
'Readable GString template toString' {
"${foo}${bar}${baz}".toString()
}
ตอนนี้เราได้ผลลัพธ์:
String adder 514
GString template 267
Readable GString template 269
GString template toString 478
Readable GString template toString 480
StringBuilder 321
StringBuffer 369
อย่างที่คุณเห็น (อย่างที่บอก) มันช้ากว่า StringBuilder หรือ StringBuffer แต่ก็ยังเร็วกว่าการเพิ่ม Strings เล็กน้อย ...
แต่ยังอ่านได้อีกมากมาย
แก้ไขหลังจากแสดงความคิดเห็นโดย Ruralcoder ด้านล่าง
อัปเดตเป็น gbench ล่าสุดสตริงที่ใหญ่กว่าสำหรับการเชื่อมต่อและการทดสอบด้วย StringBuilder เริ่มต้นเป็นขนาดที่ดี
@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()
ให้
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()
ผนวกการทดสอบ GString ทั้งสองแบบString adder
แสดงให้เห็นว่าเรียกฉันว่าพวกเขาดำเนินการแล้วเกือบจะเหมือนกับ ฉันเดาว่าการทดสอบที่คุณเรียกใช้ไม่ได้จัดการกับการเรียงต่อกันดังนั้นจึงเป็นเพียงการสร้างวัตถุ GString และจัดเก็บข้อมูลอ้างอิงStringBuilder
ยังคงเร็วที่สุดรับมือหากคุณต้องการString
ในบางจุด