❮
[Kotlin] String / StringBuilder / StringBuffer - append Test -
20180710
https://letyarch.blogspot.com/2018/04/java-string-stringbuilder-stringbuffer.html
Java 와 Kotlin의 내부구현에 큰 차이가 없기 때문에 위 링크와 큰 차이는 없다.
* 요약 *
- 속도 : StringBuilder > StringBuffer > String
- String만 immutable
- StringBuffer만 thread-safe
여기서는 주어진 문자열 사이에 # 을 넣는 코드에 StringBuilder(java.lang, kotlin) , StringBuffer, String 를 바꾸어가면서 실행시간 비교를 해보자.
길이 100000, 랜덤하게 생성된 문자열을 대상으로 한다.
테스트용 코드 :
import java.util.*
import kotlin.streams.asSequence
fun main(args : Array<String>)
{
var s = makeString(100000)
print("Test String : ")
println(s)
print("insertSharpStringBuffer : ")
measuringTime(s) {insertSharpStringBuffer(s)} print("insertSharpStringBuilder : ")
measuringTime(s) {insertSharpStringBuilder(s)} print("insertSharpStringBuilderJava : ")
measuringTime(s) {insertSharpStringBuilderJava(s)} print("insertSharpString : ")
measuringTime(s) {insertSharpString(s)}
}
fun insertSharpString(s: String) : String{
var n = s.length
var ret : String = "^#" s.forEach { ret += it; ret += '#' } ret += '$' return ret
}
fun insertSharpStringBuffer(s: String) : String{
var n = s.length
var ret : StringBuffer = StringBuffer("^#")
s.forEach { ret.append(it); ret.append('#') } ret.append('$')
return ret.toString()
}
fun insertSharpStringBuilder(s: String) : String{
var n = s.length
var ret : StringBuilder = StringBuilder("^#")
s.forEach { ret.append(it); ret.append('#') } ret.append('$')
return ret.toString()
}
fun insertSharpStringBuilderJava(s: String) : String{
var n = s.length
var ret : java.lang.StringBuilder = java.lang.StringBuilder("^#")
s.forEach { ret.append(it); ret.append('#') } ret.append('$')
return ret.toString()
}
fun measuringTime(
s : String,
func : (String) -> (String)
)
{
var begin : Long = System.currentTimeMillis()
func(s)
println(System.currentTimeMillis() - begin)
}
fun makeString(outputStringLength: Long): String {
val source = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
//which produces a stream of length random numbers each from minValue to maxValue-1 return Random().ints(outputStringLength, 0, source.length)
.asSequence()
.map(source::get)
.joinToString("")
}
|
실행 결과 1 |
|
실행 결과 2 |
|
실행 결과 3
역시 String.plus() 의 시간복잡도가 O(N) 이라 나머지와는 차이가 많이 난다.
String을 빼고 문자열 길이를 100만으로 300번 테스트를 해보자.
예상대로 StringBuilder가 StringBuffer 보다는 빨랐다.
java.lang.StringBuilder 와 kotlin.text.StringBuilder의 차이도 확인할 수 있다.
|