2010-08-03 4 views
-2
String prefix = ""; 
for (String serverId : serverIds) { 
    sb.append(prefix); 
    prefix = ","; 
    sb.append(serverId); 
} 

다음 코드는 위 코드보다 빠르게 실행됩니다. ","접두어 개체는 반복 할 때마다 불필요한 개체 생성을 수행합니다. 위의 코드는 86324 나노 초가 걸리는 반면, 내 코드는 68165 나노 초 밖에 걸리지 않습니다.끝에있는 구분 기호를 제거하십시오.

List<String> l = Arrays.asList("SURESH1","SURESH2","SURESH4","SURESH5"); 
StringBuffer l1 = new StringBuffer(); 
int sz = l.size(); 
int i=0; long t = 
System.nanoTime(); 
for (String s : l) 
{ 
    l1.append(s);  
    if (i != sz-1) 
     l1.append(","); i++; 
    } 
} 
long t2 = System.nanoTime(); 
System.out.println ((t2-t)); System.out.println(l1); 

// The time taken for the above code is 68165 nano seconds 
SURESH1,SURESH2,SURESH4,SURESH5 

내가보기에 어떤 것이 더 좋을지 알려주세요.

+0

가능한 복제본 [(자바) StringBuilder의 마지막 문자를 제거 하시겠습니까?] (http://stackoverflow.com/questions/3395286/java-remove-last-character-of-a-stringbuilder) –

+0

죄송합니다. 투표. –

+0

@jon skeet, 나는 그것이 중복이라는 것을 알고있다. 아무도 대답을하지 못한다. 그래서 새로운 것을 만들고, 사과한다. 어떤 코드가 더 빠르다는 것을 알려주십시오. –

답변

2

몇 가지 포인트 :

  • 내 코드가 선행 요소의 수를 알 필요가 없습니다. 즉, 모든 작업이 가능합니다. Iterable<String>
  • StringBuilder 대신 StringBuffer을 사용하는 이유는 무엇입니까?
  • "빈 접두사 개체"는 한 번만 생성됩니다 ... 코드에서 빈 문자열 리터럴에 대한 참조가없는 것은 확실합니까?
  • 어떤 코드를 더 쉽게 읽을 수 있습니까? 그것은 대부분의 경우 타이밍보다 중요 할 수 있습니다. (현재 게시 된 코드에 충분한 중괄호가없는 것처럼 보입니다. 예를 들어 ...)
  • 라이브러리 방법을 처음부터 사용하지 않는 이유는 무엇입니까 (예 : 구아바의 Joiner 클래스)?
  • 벤치 마크에서이 작은 시간을 사용하지 마십시오. 시스템 클록이 얼마나 정확할 것으로 기대하십니까? 시간이 많이 걸릴 때까지 많은 작업을 반복해야합니다.

편집 : 첫 번째 점을 해결 이제 하나 개의 대안이 변경 될 :

boolean first = true; 
StringBuilder builder = new StringBuilder(); 
for (String value : values) { 
    if (first) { 
    first = false; 
    } else { 
    builder.append(","); 
    } 
    builder.append(value); 
} 

또는 당신은 정말 카운터 사용과 같은 경우 :

int i = 0; 
StringBuilder builder = new StringBuilder(); 
for (String value : values) { 
    if (i != 0) { 
    builder.append(","); 
    } 
    builder.append(value); 
    i++; 
} 
+0

. 죄송합니다 ","모든 반복에서 생성되지는 않습니다. 동일한 문자열 풀을 참조합니다. –

+0

skeet 나는이 코드를 8 만개의 요소로 반복했다. –

+0

@ Suresh S : 80,000 개의 가치가 있다고하더라도 나는 여전히 용의주 할 수 있습니다 ... 절대적으로 얼마나 걸릴까요? 소금 한 덩어리로 1 초도 안되는 결과를 얻었습니다. 벤치마킹에 문제가있을 수있는 여러 가지 다른 것들이 있습니다 ... 우리는 확실히 말할 수있는 전체 코드를 확인해야합니다. –

0

을 나는 또한에 대한 심각한 의심이 코딩하고 벤치 마크를 실행하는 방식. 처음에는 코드가 JIT 컴파일되지 않았다고 제안합니다. 결과를 무효화 할 수있는 Java 벤치 마크로 많은 사람들이 실수합니다. 완전한 코드를 보여주세요.

다른 점은 대부분의 경우 이러한 미세 최적화는 실제 프로그램의 성능과 관련이 없다는 것입니다. 프로그램이 이미 충분히 빠르게 실행되고 있거나 프로그램의 잘못된 부분을 최적화하는 데 시간을 낭비하고 있습니다.

관련 문제