Untuk penggunaan umum, solusi yang melibatkan kelas StringBuilder adalah yang terbaik untuk mengulang string multi-karakter. Ini dioptimalkan untuk menangani kombinasi sejumlah besar string dengan cara yang tidak dapat digabungkan dengan sederhana dan akan sulit atau tidak mungkin dilakukan secara lebih efisien dengan tangan. Solusi StringBuilder yang ditampilkan di sini menggunakan iterasi O (N) untuk menyelesaikan, laju rata yang proporsional dengan berapa kali itu diulang.
Namun, untuk jumlah pengulangan yang sangat besar, atau di mana tingkat efisiensi yang tinggi harus ditekan, pendekatan yang lebih baik adalah melakukan sesuatu yang mirip dengan fungsi dasar StringBuilder tetapi untuk menghasilkan salinan tambahan dari tujuan, daripada dari string asli, seperti di bawah ini.
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);
}
Ini menggandakan panjang string sumber / tujuan dengan setiap iterasi, yang menghemat overhead pengaturan ulang penghitung setiap kali akan melewati string asli, alih-alih membaca dengan lancar dan menyalin string yang sekarang jauh lebih lama, sesuatu yang prosesor modern dapat lakukan banyak lebih efisien.
Ia menggunakan basis-2 logaritma untuk menemukan berapa kali perlu menggandakan panjang string dan kemudian mulai melakukannya berkali-kali. Karena sisa yang akan disalin sekarang kurang dari total panjangnya menyalin, maka kemudian hanya dapat menyalin subset dari apa yang telah dihasilkan.
Saya telah menggunakan metode Array.Copy () atas penggunaan StringBuilder, karena menyalin isi dari StringBuilder ke dalam dirinya sendiri akan memiliki overhead menghasilkan string baru dengan konten itu dengan setiap iterasi. Array.Copy () menghindari ini, sambil tetap beroperasi dengan tingkat efisiensi yang sangat tinggi.
Solusi ini mengambil iterasi O (1 + log N) untuk menyelesaikan, tingkat yang meningkat secara logaritmik dengan jumlah pengulangan (menggandakan jumlah pengulangan sama dengan satu iterasi tambahan), penghematan yang substansial dibandingkan metode lain, yang meningkat secara proporsional.