성능 벤치마킹: 문자열 및 문자열 빌더
Java의 문자열은 변경할 수 없습니다. 문자열을 수정하면 최신 콘텐츠로 힙 메모리에 새 문자열 개체가 생성되며 원래 문자열은 절대 변경되지 않습니다.
불변성
String str = "You cannot modify "
str = str + "me"
str 변수에 "me"값을 추가하면 새 값
You cannot modify me
으로 새 String 객체가 생성되고 str에 할당됩니다. 원래 문자열You cannot modify
은 변경되지 않습니다.성능
+
연산자를 사용하는 것과 같이 문자열을 자주 수정하면 상당한 성능 문제가 발생합니다. +
추가가 사용될 때마다 새 문자열 객체가 생성되고 재할당됩니다.문자열을 효율적으로 수정하려면 문자열을 변경하고 힙 메모리에 추가 객체를 생성하지 않는 StringBuilder를 고려해야 합니다.
문자열 수정
문자열을 수정하려면 StringBuilder 클래스를 사용하십시오. 이것은 새로운 String 객체를 생성하는 것이 아니라 기존 객체를 변경합니다.
StringBuilder str = new StringBuilder("You can modify.");
str.append("me");
성능 벤치마킹
String 및 StringBuilder를 사용하여
concatenation
작업 성능 벤치마크를 고려하십시오. 다음을 고려하세요.[100k, 200k, 300k, 400k, 500k, 600k, 700k, 800k, 900k, 1m].
inputSample
에 대해 문자열 "a"n 시간을 연결하는 데 걸리는 시간을 알고 싶습니다. 문자열 클래스
public class StringBenchmark {
public static void main(String[] args) {
String appendCharacter = "a";
int inputSample[] = new int[]{
100000, 200000, 300000, 400000,
500000, 600000, 700000, 800000,
900000, 1000000};
for (int n : inputSample) {
double startTime = System.nanoTime();
testStringAppend(n, "", appendCharacter);
double endTime = System.nanoTime();
double duration = (endTime - startTime) / 1000000000;
String seconds = String.format("%.2f", duration);
System.out.println("n = " + n + ": seconds: " + seconds);
}
}
static void testStringAppend(int n, String str, String appendCharacter) {
for (int i = 1; i <= n; i++) {
str += appendCharacter;
}
}
}
문자열 클래스 결과
n = 100000: seconds: 0.38
n = 200000: seconds: 0.99
n = 300000: seconds: 2.14
n = 400000: seconds: 3.74
n = 500000: seconds: 5.79
n = 600000: seconds: 8.28
n = 700000: seconds: 11.16
n = 800000: seconds: 14.65
n = 900000: seconds: 18.29
n = 1000000: seconds: 22.43
StringBuilder 클래스
public class StringBuilderBenchmark {
public static void main(String[] args) {
String appendCharacter = "a";
int inputSample[] = new int[]{
100000, 200000, 300000, 400000,
500000, 600000, 700000, 800000,
900000, 1000000};
for(int n: inputSample){
double startTime = System.nanoTime();
testStringAppend(n, new StringBuilder(""), appendCharacter);
double endTime = System.nanoTime();
double duration = (endTime - startTime)/1000000000;
String seconds = String.format("%.7f", duration);
System.out.println("n = "+n+": seconds: "+seconds);
}
}
static void testStringAppend(int n, StringBuilder str, String appendCharacter){
for(int i = 1; i <= n; i++){
str.append(appendCharacter);
}
}
}
n = 100000: seconds: 0.0027
n = 200000: seconds: 0.0013
n = 300000: seconds: 0.0015
n = 400000: seconds: 0.0015
n = 500000: seconds: 0.0018
n = 600000: seconds: 0.0022
n = 700000: seconds: 0.0026
n = 800000: seconds: 0.0029
n = 900000: seconds: 0.0032
n = 1000000: seconds: 0.0036
실행 시간: 추가
입력(n)
스트링(S)
문자열 작성기(S)
10만
0.38
0.0027
20만
0.99
0.0013
30만
2.14
0.0015
40만
3.74
0.0015
50만
5.79
0.0018
60만
8.28
0.0022
70만
11.16
0.0026
80만
14.65
0.0029
90만
18.29
0.0032
1m
22시 43분
0.0036
결론
concatenation
또는 modification
작업을 수행할 때 String 클래스보다 훨씬 빠르게 실행됩니다. Reference
이 문제에 관하여(성능 벤치마킹: 문자열 및 문자열 빌더), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/this-is-learning/performance-benchmarking-string-and-string-builder-3bid텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)