내가 그렇지 않으면 모두 StringBuilder는 3 회까지 버퍼를 확장해야 할 수도 있습니다,이 문자열Java 컴파일러는 문자열 연결에 비효율적 인 코드를 작성합니까?
여기의 StringBuilder의 버퍼가 충분히있는 모든 문자열에 맞게 용량으로 작성됩니다new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
을 concatinate하는 가장 효율적인 방법이라고 생각했다.
하지만이
String s4 = s1 + s2 + s3;
디 컴파일 컴파일/때 좀 더 효율적인 방법
String s4 = (new StringBuilder(String.valueOf(s1))).append(s2).append(s3).toString();
로 javac의 (1.7.0_03)에 의해 건설을 .class의 실제 코드를 얻을?
는 스티븐 Schlansker에 의해 제안 된 바와 같이 UPDATE는
, 여기에 성능 테스트
String s1 = "";
String s2 = s1 + s1 + s1;
String s3 = s1 + s1 + s1 + s1 + s1 + s1;
long t0 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
String s4 = new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
// String s4 = s1 + s2 + s3;
}
System.out.println(System.currentTimeMillis() - t0);
이 완벽 하진하지만 결과는 내 버전은 30 % 더 빠른 ~임을 증명하는 것 같다. 내 노트 (Celeron 925)에서는 ver.1에 대해 ~ 230 ms, ver.2에 ~ 300 ms를 제공합니다. 사실 이것은 내가 예상 한 것입니다. 그래서 javac이 문자열 concatination을보다 효율적으로 컴파일한다면 좋은 생각이라고 생각합니다. JDK 클래스에서도
return "\\Q" + s + "\\E";
과 같은 충분한 행이 있습니다. 마지막 줄은 효율성을 위해 설계된 java.util.Pattern에서입니다.
원하는 경우,'Pattern.compile (s, Pattern.LITERAL);을 사용하면 문자열's' 당 한 번만 수행하면됩니다. StringBuilder를 작성하고 문자열을 구문 분석하지 않아도됩니다. –