자바 5.0 문자열 작업 최적화

최근 경영 진 은 프로젝트 의 모든 문자열'+'동작 을 StringBuilder/StringBuffer 방식 으로 변경 해 달라 고 요청 했다.예전 에 자바 5.0 이 발표 되 었 을 때 이 새로운 컴 파일 러 버 전에 서 문자열 의 조작 을 최적화 시 키 고 아예 철저하게 연구 하 는 것 을 본 적 이 있 는 것 같 습 니 다.
 
     테스트 코드
     
String s1="********";
s1+="--------";
s1+="^^^^^^^^";
StringBuilder s2=new StringBuilder("********");
s2.append("--------");
s2.append("^^^^^^^^");

    대응 하 는 class 파일 키워드 코드
   
astore_1 [s1]//s1    
     3  new java.lang.StringBuilder [18]//JVM s1   StringBuilder
     6  dup
     7  aload_1 [s1]
     8  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [20]
    11  invokespecial java.lang.StringBuilder(java.lang.String) [26]
    14  ldc <String "--------"> [29]
    16  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [31]//  “+”  
    19  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [35]//         String
    22  astore_1 [s1]
    23  new java.lang.StringBuilder [18]//   string   StringBuilder,         
    26  dup
    27  aload_1 [s1]
    28  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [20]
    31  invokespecial java.lang.StringBuilder(java.lang.String) [26]
    34  ldc <String "^^^^^^^^"> [39]
    36  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [31]
    39  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [35]
    42  astore_1 [s1]
    43  new java.lang.StringBuilder [18]//     StringBuilder ,              
    46  dup
    47  ldc <String "********"> [16]//   StringBuilder        ,        String StringBuilder     ,  append。
    49  invokespecial java.lang.StringBuilder(java.lang.String) [26]
    52  astore_2 [s2]
    53  aload_2 [s2]
    54  ldc <String "--------"> [29]
    56  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [31]
    59  pop
    60  aload_2 [s2]
    61  ldc <String "^^^^^^^^"> [39]
    63  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [31]

 
 이렇게 하면 기본적으로 결론 을 얻 을 수 있다.5.0 이후 버 전에 서 String 에 대해'+'작업 을 직접 하면 자바 컴 파 일 러 는 StringBuilder 로 최적화 한 다음 에 append 작업 을 한 다음 에 왔다갔다 하 는 String<--->StringBuilder 의 전환 을 하고 StringBuilder 를 사용 하면 계속 append 를 직접 StringBuilder--->String 의 전환 을 할 수 있다.따라서 효율 적 으로 String 의'+'작업 은 간결 하고 1.4 이전 버 전의 String 대상 재 생 성 작업 보다 개선 되 었 지만 효율 적 으로 String Builder 와 어느 정도 차이 가 있 고 구체 적 인 차이 가 얼마나 큰 지 아래 에 테스트 코드 를 마음대로 썼 다.
 
 
    
String str1="";
		long start=System.currentTimeMillis();
		for (int i = 0; i < 20000; i++) {
			str1+="test";
		}
		str1+="--------";
		long end=System.currentTimeMillis();
		System.out.println("String  "+(end-start));
		//StringBuilder
		start=System.currentTimeMillis();
		StringBuilder builder=new StringBuilder();
		for (int i = 0; i < 50000; i++) {
			builder.append("test");
		}
		builder.append("--------");
		builder.toString();
		end=System.currentTimeMillis();
		System.out.println("StringBuilder  "+(end-start));
		//     StringBuffer
		start=System.currentTimeMillis();
		StringBuffer buffer=new StringBuffer();
		for (int i = 0; i < 50000; i++) {
			buffer.append("test");
		}
		buffer.append("--------");
		buffer.toString();
		end=System.currentTimeMillis();
		System.out.println("StringBuffer  "+(end-start));

 
   결과:
String 소모 시간 7202 StringBuilder 소모 시간 16StringBuffer 소모 시간 0
 
StringBuilder 는 스 레 드 가 안전 하지 않 습 니 다.StringBuffer 는 스 레 드 가 안전 합 니 다.이치 상 StringBuilder 는 StringBuffer 보다 빠 를 것 입 니 다.하지만 결 과 는 좀 의외 입 니 다.테스트 횟수 가 적은 이유 일 수도 있 습 니 다.설 이 되 었 으 니 이렇게 많이 쓰 세 요.
 

좋은 웹페이지 즐겨찾기