2012-12-03 2 views
3

내가 그렇지 않으면 모두 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에서입니다.

+0

원하는 경우,'Pattern.compile (s, Pattern.LITERAL);을 사용하면 문자열's' 당 한 번만 수행하면됩니다. StringBuilder를 작성하고 문자열을 구문 분석하지 않아도됩니다. –

답변

4

당신이 그것을 실행하는 환경에 달려 있습니다. 어떤 종류의 테스트 없이는 다른 하나보다 낫다는 결론을 확실히 내릴 수는 없습니다.

그렇긴해도, 최종 크기를 미리 아는 것이 도움이 될 것이라는 데 동의합니다.

마이크로 벤치 마크를 작성하면 거의 모든 응용 프로그램에서 그 차이가 전혀 없음을 알 수 있습니다. 벤치 마크에 대한 조언을

편집 :

난 당신이 게시물에 몇 가지 실제 데이터를 추가 한 참조하십시오. 축하해! 올바른 길을 가고 있습니다 :-)

불행히도 Java는 올바른 벤치 마크 작성에 적대적인 많은 기능을 가지고 있습니다. 결과가 정확하도록하려면 How do I write a correct micro-benchmark in Java?을 살펴 봐야합니다. 또한이 컨텍스트에서 크게 보이는 속도 향상은 "실제"프로그램의 맥락에서 훨씬 더 작아 보일 것이라고 생각할 가치가 있습니다. 단일 데이터베이스 가져 오기 (밀리 초 단위로 측정)는 메모리 할당에서 아무런 이득도 얻지 못합니다 (나노초 단위로 측정).

+0

좋은 지적은, 그것을 할 것입니다 –

+1

+1 - 마지막 문장을 위해. –

관련 문제