일반적으로 StringBuilder 클래스와 관련된 솔루션은 여러 문자 문자열을 반복하는 데 가장 좋습니다. 간단한 연결이 불가능하고 손으로보다 효율적으로 수행하기 어렵거나 불가능한 방식으로 많은 수의 문자열 조합을 처리하도록 최적화되어 있습니다. 여기에 표시된 StringBuilder 솔루션은 O (N) 반복을 사용하여 반복 횟수에 비례하는 고정 속도를 사용합니다.
그러나 반복 횟수가 많거나 효율성을 높여야하는 경우 StringBuilder의 기본 기능과 유사한 작업을 수행하지만 원래 문자열이 아닌 대상에서 추가 사본을 생성하는 것이 더 나은 방법입니다. 아래.
public static string Repeat_CharArray_LogN(this string str, int times)
{
int limit = (int)Math.Log(times, 2);
char[] buffer = new char[str.Length * times];
int width = str.Length;
Array.Copy(str.ToCharArray(), buffer, width);
for (int index = 0; index < limit; index++)
{
Array.Copy(buffer, 0, buffer, width, width);
width *= 2;
}
Array.Copy(buffer, 0, buffer, width, str.Length * times - width);
return new string(buffer);
}
이렇게하면 각 반복마다 소스 / 대상 문자열의 길이가 두 배가되므로 원래 문자열을 통과 할 때마다 카운터를 재설정하는 오버 헤드가 줄어드는 대신 현대 프로세서는 훨씬 더 긴 문자열을 부드럽게 읽고 복사 할 수 있습니다. 보다 효율적으로.
기본 2 로그를 사용하여 문자열 길이를 두 배로 늘려야하는 횟수를 찾은 다음 여러 번 진행합니다. 복사 될 나머지는 이제 복사하는 총 길이보다 짧으므로 이미 생성 된 것의 서브 세트를 복사 할 수 있습니다.
StringBuilder의 내용을 자체로 복사하면 반복 할 때마다 해당 내용으로 새 문자열을 생성하는 오버 헤드가 있으므로 StringBuilder 사용에 대해 Array.Copy () 메서드를 사용했습니다. Array.Copy ()는 여전히 매우 높은 효율로 작동하면서 이것을 피합니다.
이 솔루션은 O (1 + log N) 반복을 완료하는데, 반복 횟수에 따라 대수적으로 증가하는 속도 (반복 횟수가 두 번의 추가 반복과 동일 함)는 다른 방법에 비해 실질적으로 절약되며 비례 적으로 증가합니다.