2014년도 글이지만...ㅎ 원문 링크는 여기
글을 통번역해서 올리려 했으나 귀찮기도 하고, 내가 언젠가 다시 읽어보기 위해서 글을 쓰는 것이기 때문에 내가 이해한 바를 요약해서 쓰기로 함
보통 GO에서 문자열 연결(String Concatenation)을 하기 위해서 쓰는 방식이 3가지가 존재한다. 그리고 Go의 Testing 패키지를 이용해 세가지 방법의 연산 성능을 측정한 GO Benchmark를 준비했다.
Method 1: Naive Appending with +=
+=연산으로 문자열을 연결하는 방식이다.
가장 확실한 접근법으로, 문자열이 제자리에서 수정될 수 있는 C/C++와 달리 GO의 문자열은 immutable하기 때문에 문자열이 변수에 할당될 때마다 새로운 메모리에 할당을 한다. +=연산은 문자열을 추가할 때마다 기존 문자열과 추가할 문자열을 새 문자열에 복사하는 방식으로 문자열 연결하는데, O(n^2)의 성능으로 조작하는 문자열의 크기가 클 수록 프로세스가 많이 느려진다.
Method 2: strings.Join
Method 3: bytes.Buffer
244kb의 문자열(각 25글자)
모든 반복에서 nextString 호출(슬라이스 생성 제외)
결론:
사실 벤치마크만 보면 +=연산(Method1) 은 고려해 볼 필요도 없을 정도로 심각하게 느려보이지만, 위의 결과와는 별개로 매우 작은 연산(문자열 100개 미만, 길이 10 이하)의 경우에는 Method1 이 준수한 성능(심지어 더 빠를수도 있음)을 보인다고 한다.
strings.Join 은 연결해야할 슬라이스 하나가 이미 생성된 경우 좋은 선택이 될 수 있으며, bytes.Buffer 은 효율성이 중요한 heavy-duty(이건 어떻게 직역하지..) 케이스의 경우 좋은 선택일 확률이 높음