Groovy와 문자열 연결
Groovy에서 문자열을 연결하는 가장 좋은 (관용적) 방법은 무엇입니까?
옵션 1:
calculateAccountNumber(bank, branch, checkDigit, account) {
bank + branch + checkDigit + account
}
옵션 2 :
calculateAccountNumber(bank, branch, checkDigit, account) {
"$bank$branch$checkDigit$account"
}
이전 Groovy 웹 사이트에서이 주제에 대한 흥미로운 점을 발견했습니다. 할 수 있지만 실행 취소하는 것이 좋습니다.
Java에서와 같이 "+"기호로 문자열을 연결할 수 있습니다. 그러나 Java는 "+"표현식의 두 항목 중 하나가 첫 번째 위치에 있든 마지막 위치에 있든 관계없이 문자열이면됩니다. Java는 "+"표현식의 문자열이 아닌 객체에서 toString () 메소드를 사용합니다. 그러나 Groovy에서는 "+"표현식의 첫 번째 항목이 올바른 방식으로 plus () 메서드를 구현하는 것이 안전해야합니다. Groovy가이를 검색하고 사용하기 때문입니다. Groovy GDK에서는 Number 및 String / StringBuffer / Character 클래스에만 문자열을 연결하기 위해 구현 된 plus () 메서드가 있습니다. 놀라움을 피하려면 항상 GStrings를 사용하세요.
저는 항상 두 번째 방법 (GString 템플릿 사용)을 사용합니다.하지만 여러분과 같은 매개 변수가 두 개 이상있을 때 ${X}
더 읽기 쉽게 만들 수 있다는 것을 알기 때문에 그것들을 감싸는 경향이 있습니다.
이러한 방법에 대해 일부 벤치 마크 ( Nagai Masato 의 우수한 GBench 모듈 사용 )를 실행하면 템플릿이 다른 방법보다 빠르다는 것을 알 수 있습니다.
@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()
내 컴퓨터에 다음과 같은 출력이 표시됩니다.
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
따라서 가독성과 속도가 유리하므로 템플릿을 권장합니다 ;-)
NB: If you add toString()
to the end of the GString methods to make the output type the same as the other metrics, and make it a fairer test, StringBuilder
and StringBuffer
beat the GString methods for speed. However as GString can be used in place of String for most things (you just need to exercise caution with Map keys and SQL statements), it can mostly be left without this final conversion
Adding these tests (as it has been asked in the comments)
'GString template toString' {
"$foo$bar$baz".toString()
}
'Readable GString template toString' {
"${foo}${bar}${baz}".toString()
}
Now we get the results:
String adder 514
GString template 267
Readable GString template 269
GString template toString 478
Readable GString template toString 480
StringBuilder 321
StringBuffer 369
So as you can see (as I said), it is slower than StringBuilder or StringBuffer, but still a bit faster than adding Strings...
But still lots more readable.
Edit after comment by ruralcoder below
Updated to latest gbench, larger strings for concatenation and a test with a StringBuilder initialised to a good size:
@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()
gives
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
def my_string = "some string"
println "here: " + my_string
Not quite sure why the answer above needs to go into benchmarks, string buffers, tests, etc.
Reproducing tim_yates answer on current hardware and adding leftShift() and concat() method to check the finding:
'String leftShift' {
foo << bar << baz
}
'String concat' {
foo.concat(bar)
.concat(baz)
.toString()
}
The outcome shows concat() to be the faster solution for a pure String, but if you can handle GString somewhere else, GString template is still ahead, while honorable mention should go to leftShift() (bitwise operator) and StringBuffer() with initial allocation:
Environment
===========
* Groovy: 2.4.8
* JVM: OpenJDK 64-Bit Server VM (25.191-b12, Oracle Corporation)
* JRE: 1.8.0_191
* Total Memory: 238 MB
* Maximum Memory: 3504 MB
* OS: Linux (4.19.13-300.fc29.x86_64, amd64)
Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On
user system cpu real
String adder 453 7 460 469
String leftShift 287 2 289 295
String concat 169 1 170 173
GString template 24 0 24 24
Readable GString template 32 0 32 32
GString template toString 400 0 400 406
Readable GString template toString 412 0 412 419
StringBuilder 325 3 328 334
StringBuffer 390 1 391 398
StringBuffer with Allocation 259 1 260 265
참고URL : https://stackoverflow.com/questions/11359333/string-concatenation-with-groovy
'programing' 카테고리의 다른 글
Razor보기 엔진-부분보기를 추가하는 방법 (0) | 2020.09.19 |
---|---|
별표와 이중 별표로 시작하는 Python 메서드 / 함수 인수 (0) | 2020.09.19 |
2017 년 IBDesignable을 사용하여 점선 (점선이 아님)을 그립니다. (0) | 2020.09.19 |
열린 cv 오류 : (-215) scn == 3 || (0) | 2020.09.19 |
OkHttp가있을 때 Retrofit을 사용하는 이유 (0) | 2020.09.19 |