StringBuilder.append 체인이 문자열 연결보다 효율적입니까?
Netbeans 힌트에 따르면 문자열 연결 대신 .append 메서드 체인 사용
StringBuilder 또는 StringBuffer의 append 메소드 호출 매개 변수에서 문자열 연결을 찾습니다.
StringBuilder.append ()가 문자열 연결보다 실제로 더 효율적입니까?
코드 샘플
StringBuilder sb = new StringBuilder();
sb.append(filename + "/");
대
StringBuilder sb = new StringBuilder();
sb.append(filename).append("/");
가독성과 기능의 균형을 맞춰야합니다.
다음이 있다고 가정 해 보겠습니다.
String str = "foo";
str += "bar";
if(baz) str += "baz";
이렇게하면 2 개의 문자열 작성기 (실제로는 1 개만 필요함)와 중간에 추가 문자열 개체가 생성됩니다. 다음을 수행하면 더 효율적일 것입니다.
StringBuilder strBuilder = new StringBuilder("foo");
strBuilder.append("bar");
if(baz) strBuilder.append("baz");
String str = strBuilder.toString();
하지만 스타 일상 첫 번째는 괜찮아 보인다고 생각합니다. 단일 개체 생성의 성능 이점은 나에게 매우 미미한 것 같습니다. 이제 3 개의 현 대신 10 개, 20 개 또는 100 개가 있다면 성능이 스타일보다 중요하다고 말할 수 있습니다. 루프에 있었다면 확실히 문자열 빌더를 사용할 것이지만, 코드를 깔끔하게 보이게하기 위해 '조잡한'방식을 사용하는 것은 몇 개의 문자열만으로도 괜찮다고 생각합니다. 하지만 ...이 안에는 매우 위험한 함정이 숨어 있습니다! 아래를 읽으십시오 (서스펜스를 구축하려면 일시 중지 ... dun dun dunnnn)
항상 명시적인 문자열 작성기를 사용한다고 말하는 사람들이 있습니다. 한 가지 이론적 근거는 코드가 계속 성장할 것이며 일반적으로 이미있는 것과 동일한 방식으로 수행 할 것이라는 것입니다 (즉, 리팩토링하는 데 시간이 걸리지 않을 것입니다.) 따라서 각각 10 개 또는 20 개의 문을 생성하게됩니다. 필요하지 않을 때 자신의 빌더. 따라서 처음부터이를 방지하기 위해 항상 명시 적 빌더를 사용한다고 말합니다.
따라서 귀하의 예에서는 특별히 빠르지는 않을 것입니다. 미래의 누군가가 파일 확장자를 원할 때 또는 그와 비슷한 것을 결정할 때 StringBuilder 대신 문자열 연결을 계속 사용하면 결국 성능 문제가 발생합니다.
우리는 또한 미래에 대해 생각할 필요가 있습니다. JDK 1.1에서 Java 코드를 다시 만들고 있고 다음과 같은 방법이 있다고 가정 해 보겠습니다.
public String concat(String s1, String s2, String s3) {
return s1 + s2 + s3;
}
그 당시에는 StringBuilder가 존재하지 않았기 때문에 느 렸을 것입니다.
그런 다음 JDK 1.3에서 StringBuffer를 사용하여 더 빠르게 만들기로 결정했습니다 (StringBuilder는 아직 존재하지 않음). 당신은 이렇게 :
public String concat(String s1, String s2, String s3) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return sb.toString();
}
훨씬 빨라집니다. 대박!
이제 JDK 1.5가 나오고 StringBuilder (StringBuffer보다 빠름)와
return s1 + s2 + s3;
...에
return new StringBuilder().append(s1).append(s2).append(s3).toString();
그러나 StringBuffer를 명시 적으로 사용하기 때문에 이러한 성능 이점을 얻지 못합니다. 따라서 똑똑해지면 Java가 당신보다 똑똑해질 때 성능이 저하되었습니다. 그래서 당신은 당신이 생각하지 않을 것들이 있다는 것을 명심해야합니다.
글쎄, 첫 번째 예제는 본질적으로 컴파일러에 의해 다음과 같은 라인을 따라 번역됩니다.
StringBuilder sb = new StringBuilder();
sb.append(new StringBuilder().append(filename).append("/").toString());
예, 여기에 어떤 비 효율성이 있습니다. 그러나 그것이 당신의 프로그램에서 정말로 중요한지 여부는 다른 질문입니다. 의심스러운 스타일 (힌트 : 주관적)을 제외하고는, 타이트한 루프에서이 작업을 수행하는 경우에만 중요합니다.
지금까지 힌트가 해당하는 특정 사례를 명시 적으로 설명하는 답변은 없습니다. 하는 말 아니에요 항상 사용하는 StringBuilder#append
대신 연결의. 그러나 이미를 사용하고 있다면 StringBuilder
중복 StringBuilder
( Dirk의 답변 참조 )과 불필요한 임시 String
인스턴스를 생성하기 때문에 연결을 혼합하는 것은 의미가 없습니다 .
몇 가지 답변은 제안 된 방법이 더 효율적인 이유를 이미 논의했지만, 요점은 이미 StringBuilder
인스턴스 가있는 경우 요청 append
하는 것입니다. append
어쨌든 전화를 걸었 기 때문에 (제 생각에는 NetBeans 힌트를 작성한 사람이 누구든 지간에) 읽기 쉽고 조금 더 효율적입니다.
이론적으로는 그렇습니다. String 객체는 불변이기 때문에 일단 생성되면 더 이상 변경할 수 없습니다. 따라서 "+"(연결)를 사용하면 기본적으로 매번 새 개체가 생성됩니다.
사실상 아닙니다. 컴파일러는 모든 "+"를 StringBuilder 추가로 대체 할만큼 영리합니다.
자세한 설명 : http://kaioa.com/node/59
추신 : Netbeans ??? 어서!
이 함수를 사용하면 두 문자열을 연결하는 것이 더 빠릅니다.
However, if you have multiple strings or different data type, you should use a StringBuilder either explicitly or implicitly. Using a +
with Strings is using a StringBuilder implicitly.
It's only more efficient if you are using lots of concatenation and really long strings. For general-use, such as creating a filename in your example, any string concatenation is just fine and more readable.
At any rate, this part of your application is unlikely to be the performance bottleneck.
ReferenceURL : https://stackoverflow.com/questions/7586266/is-chain-of-stringbuilder-append-more-efficient-than-string-concatenation
'developer tip' 카테고리의 다른 글
Django 쿼리 관련 필드 수 (0) | 2020.12.30 |
---|---|
유형 차이 적용 (0) | 2020.12.30 |
std :: function <>과 표준 함수 포인터의 차이점은 무엇입니까? (0) | 2020.12.30 |
Mac에서 Bash를 사용하여 기본 브라우저로 .html 파일 열기 (0) | 2020.12.30 |
zsh 함수 정의를 표시하는 방법 (예 : bash "type myfunc")? (0) | 2020.12.30 |