비효율적 인 이유에 대한 설명은 적어도 (C, Java, C #)에 익숙한 언어에서는 정확하지만 대량의 문자열 연결을 수행하는 것이 일반적으로 동의하지는 않습니다. 내가 작업하고 C # 코드에서의 풍부한 사용이 StringBuilder
, String.Format
이상 - 재 할당을 피하기 위해 techiniques을 저장하는 모든 메모리이다 등.
따라서 질문에 대한 답을 얻으려면 다른 질문을해야합니다. 문자열을 연결하는 것이 실제로 문제가되지 않으면 왜 클래스가 좋아 StringBuilder
하고 StringBuffer
존재 합니까? 세미 클래스 프로그래밍 서적과 클래스에도 그러한 클래스의 사용이 포함되는 이유는 무엇입니까? 조기 최적화 조언이 그렇게 두드러진 이유는 무엇입니까?
대부분의 문자열 연결 개발자가 자신의 답변을 순수한 경험에 기반을 둔다면 대부분은 차이를 만들지 않으며 "더 읽기 쉬운"을 위해 이러한 도구를 사용하지 않을 것이라고 말합니다 for (int i=0; i<1000; i++) { strA += strB; }
. 그러나 그들은 그것을 측정하지 않았습니다.
이 질문에 대한 실제 답변은 이 SO 답변 에서 찾을 수 있습니다. 이 경우 한 번에 50,000 개의 문자열 (응용 프로그램에 따라 공통적 일 수 있음)을 연결할 때 작은 문자열조차도 1000 배의 성능 저하를 초래했습니다 .
문자 그대로 성능이 전혀 의미가없는 경우에는 반드시 연결하십시오. 그러나 대안 (StringBuilder)을 사용하는 것이 어렵거나 읽기 쉽지 않기 때문에 "조기 최적화"방어를 호출해서는 안되는 합리적인 프로그래밍 방법이 될 것이라고 동의하지 않습니다.
최신 정보:
나는 이것이 당신의 플랫폼을 알고 최선의 관행을 따르는 것이라고 생각합니다 . 슬프게도 보편적이지 않습니다 . 서로 다른 두 "현대 언어"의 두 가지 예 :
- 또 다른 SO 답변 에서 정확한 반대 성능 특성 (array.join vs + =)이 때때로 JavaScript 에서 사실 로 밝혀졌습니다 . 일부 브라우저에서 문자열 연결은 자동으로 최적화 된 것으로 보이며 그렇지 않은 경우에는 그렇지 않습니다. 따라서 (적어도 SO 질문에서) 권장 사항은 연결하고 걱정하지 않는 것입니다.
- 다른 경우, Java 컴파일러 는 연결을 StringBuilder와 같은보다 효율적인 구성으로 자동 대체 할 수 있습니다 . 그러나 다른 사람들이 지적했듯이 이것은 결정적이지 않으며 보장되지 않으며 StringBuilder를 사용하더라도 가독성이 손상되지 않습니다. 이 특별한 경우에는 큰 컬렉션에 연결을 사용하거나 결정적이지 않은 Java 컴파일러 동작에 의존하지 않는 것이 좋습니다. 마찬가지로 .NET에서는 정렬 최적화가 수행되지 않습니다 .
모든 플랫폼의 모든 뉘앙스를 즉시 알지 못하는 것이 정확히 중요한 죄는 아니지만, 이와 같은 중요한 플랫폼 문제를 무시하는 것은 거의 Java에서 C ++로 이동하고 메모리 할당 해제에 신경 쓰지 않는 것과 거의 같습니다.