나는 그렇게 성능을 최적화하려는 것이 타당하다고 생각하지 않습니다. 오늘 (2019) 두 통계는 모두 I5 노트북에서 100.000.000 루프에 대해 약 11 초를 실행합니다.
String a;
StringBuilder sb = new StringBuilder();
long time = 0;
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
sb3.append("someString2");
sb3.append("someStrin4g");
sb3.append("someStr5ing");
sb3.append("someSt7ring");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
sb.append("someString2");
sb.append("someStrin4g");
sb.append("someStr5ing");
sb.append("someSt7ring");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 11000 msec (루프 내부 선언) 및 8236 msec (루프 외부 선언)
수십억 개의 루프가있는 주소 중복 제거 프로그램을 실행하더라도 2 초의 차이가 있습니다. 프로그램이 몇 시간 동안 실행되기 때문에 1 억 루프의 경우 아무런 차이가 없습니다. 또한 append 문이 하나만있는 경우 상황이 다릅니다.
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3416 msec (inside loop), 3555 msec (outside loop) 루프 내에서 StringBuilder를 생성하는 첫 번째 명령문이이 경우 더 빠릅니다. 그리고 실행 순서를 변경하면 훨씬 더 빠릅니다.
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3638msec (외부 루프), 2908msec (내부 루프)
감사합니다, Ulrich