아래 예를 참조하십시오.
static final int MAX_ITERATIONS = 50000;
static final int CALC_AVG_EVERY = 10000;
public static void main(String[] args) {
printBytecodeVersion();
printJavaVersion();
case1();//str.concat
case2();//+=
case3();//StringBuilder
}
static void case1() {
System.out.println("[str1.concat(str2)]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
String str = "";
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str = str.concat(UUID.randomUUID() + "---");
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void case2() {
System.out.println("[str1+=str2]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
String str = "";
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str += UUID.randomUUID() + "---";
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void case3() {
System.out.println("[str1.append(str2)]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
StringBuilder str = new StringBuilder("");
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str.append(UUID.randomUUID() + "---");
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void saveTime(List<Long> executionTimes, long startTime) {
executionTimes.add(System.currentTimeMillis() - startTime);
if (executionTimes.size() % CALC_AVG_EVERY == 0) {
out.println("average time for " + executionTimes.size() + " concatenations: "
+ NumberFormat.getInstance().format(executionTimes.stream().mapToLong(Long::longValue).average().orElseGet(() -> 0))
+ " ms avg");
executionTimes.clear();
}
}
산출:
java 바이트 코드 버전 : 8
java.version : 1.8.0_144
[str1.concat (str2)]
10000 연결의 평균 시간 : 10000 연결의 평균
평균 시간 : 10000 연결의 평균
평균 시간 : 10000 연결의 평균
평균 시간 : 0.327 ms의 평균 평균 시간 10000 회씩 연결 : 0.501 밀리 평균
10000 회씩 연결 평균 시간 : 0.656 MS가 및 평균
길이의 문자열을 만든 : 1950000에서 17,745 MS
[str1과 + = STR2]
평균 시간을 10000 회씩 연결을 위해 : 0.21 MS는 평균
10,000 회씩 연결 평균 시간 : 0.652 MS는 평균
평균 시간 10000 연결 : 평균 1.129ms 평균
10000 연결 : 평균 1.727ms
10000 연결의 평균 시간 : 평균 2.302ms 60279ms
10000 연결에 대한
[str1.append (str2)] 평균 시간의
문자열 : 1950000 생성 : 10000 연결에
대한 평균
평균 시간 : 0.002 ms 평균
10000 연결에 대한 평균 평균 시간 : 10000 연결에 대한 평균 평균 시간 : 0.0000 ms 10000 연결에 대한 평균 평균 시간 : 0.002 ms
10000 연결의 평균 평균 시간
: 0.002ms 평균 길이의 문자열 : 100ms 에서 1950000
문자열 길이가 길수록 연결 시간도 늘어납니다.
그것이 StringBuilder
꼭 필요한 곳입니다.
보시다시피 연결 : UUID.randomUUID()+"---"
은 실제로 시간에 영향을 미치지 않습니다.
추신 : Java에서 언제 StringBuilder를 사용할 지는 실제로 이것의 복제본 이라고 생각하지 않습니다 .
이 질문은 toString()
대부분의 시간이 거대한 줄을 연결하지 않는 것에 대해 이야기 합니다.
2019 년 업데이트
이후 java8
시간, 상황이 조금 변경되었습니다. 이제 (java13)의 연결 시간 +=
은 실제로와 같습니다 str.concat()
. 그러나 StringBuilder
연결 시간은 여전히 일정 합니다. (위의 원본 게시물은 더 자세한 출력을 추가하기 위해 약간 편집되었습니다)
자바 바이트 코드 버전 : 13
java.version : 13.0.1
[str1.concat (STR2)]
10000 회씩 평균 시간 : 0.047 MS는 평균
10000 회씩 평균 시간이 0.1 밀리 초를 평균
10000 회씩 평균 시간 : 0.17 MS는 평균
의 평균 시간 10000 연결 :
평균 10000 연결의 평균 시간 : 0.255 ms avg 평균
길이 : 0.336 ms 평균 생성 된 문자열 : 9147 ms 에서 1950000
[str1 + = str2]
10000 연결의
평균 시간 : 0.000 ms 평균 : 10000 연결의 평균 시간 : 0.097 ms 평균
평균 시간 10000 연결 : 평균 0.249ms
평균 시간 10000 연결 : 평균 0.298ms
10000 연결의 평균 시간 : 평균 0.326 ms 10191 ms
문자열 : 1950000 생성 :
10000 연결에 대한
[str1.append (str2)] 평균 시간 : 10000 연결에 대한 평균
평균 시간 : 0.001 ms 평균
10000 연결에 대한 평균
평균 시간 : 10000 연결에 대한 평균 시간 : 0.001 ms 평균
10000 연결에 대한 평균 시간 : 10000 연결에 대한 평균 평균 시간 : 0.001 ms 0.001 밀리 및 평균
에 1,950,000 : 길이의 문자열을 만든 43 밀리
주목할만한 bytecode:8/java.version:13
조합은 다음과 비교할 때 성능상의 이점이 있습니다.bytecode:8/java.version:8