Do ogólnego użytku rozwiązania obejmujące klasę StringBuilder są najlepsze do powtarzania ciągów wieloznakowych. Jest zoptymalizowany do obsługi kombinacji dużej liczby ciągów w sposób, którego nie może wykonać proste łączenie, a ręczne lub bardziej wydajne byłoby trudne lub niemożliwe. Pokazane tutaj rozwiązania StringBuilder wykorzystują iteracje O (N) do zrobienia, ryczałt proporcjonalny do liczby powtórzeń.
Jednak w przypadku bardzo dużej liczby powtórzeń lub gdy trzeba z niego wycisnąć wysoki poziom wydajności, lepszym podejściem jest zrobienie czegoś podobnego do podstawowej funkcjonalności StringBuilder, ale tworzenie dodatkowych kopii z miejsca docelowego, a nie z oryginalnego ciągu, jak poniżej.
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);
}
Podwaja to długość ciągu źródłowego / docelowego przy każdej iteracji, co oszczędza narzutów związanych z resetowaniem liczników za każdym razem, gdy przejdzie on przez oryginalny ciąg, zamiast płynnie czytając i kopiując teraz znacznie dłuższy ciąg, co współczesne procesory mogą wiele zrobić wydajniej.
Używa logarytmu base-2, aby dowiedzieć się, ile razy musi podwoić długość ciągu, a następnie tyle razy. Ponieważ pozostała część do skopiowania jest teraz mniejsza niż całkowita długość, z której kopiuje, może po prostu skopiować podzbiór tego, co już wygenerował.
Użyłem metody Array.Copy () nad użyciem StringBuilder, ponieważ kopiowanie zawartości StringBuilder do samego siebie wiązałoby się z koniecznością tworzenia nowego ciągu z tą zawartością przy każdej iteracji. Array.Copy () unika tego, a jednocześnie działa z bardzo wysoką wydajnością.
To rozwiązanie wymaga wykonania iteracji O (1 + log N) , której szybkość wzrasta logarytmicznie wraz z liczbą powtórzeń (podwojenie liczby powtórzeń równa się jednej dodatkowej iteracji), co oznacza znaczne oszczędności w porównaniu z innymi metodami, które zwiększają się proporcjonalnie.