สำหรับการใช้งานทั่วไปโซลูชันที่เกี่ยวข้องกับคลาส 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 เพื่อค้นหาจำนวนครั้งที่ต้องใช้สองเท่าของความยาวของสตริงและจากนั้นดำเนินการทำเช่นนั้นหลายครั้ง เนื่องจากส่วนที่เหลือที่จะทำการคัดลอกนั้นน้อยกว่าความยาวทั้งหมดที่จะทำการคัดลอกจากนั้นจึงสามารถคัดลอกส่วนย่อยของสิ่งที่สร้างไว้แล้วได้
ฉันใช้ Array.Copy () วิธีการมากกว่าการใช้ StringBuilder เป็นการคัดลอกเนื้อหาของ StringBuilder ลงในตัวเองจะมีค่าใช้จ่ายในการผลิตสตริงใหม่ที่มีเนื้อหาที่มีการทำซ้ำแต่ละ Array.Copy () หลีกเลี่ยงสิ่งนี้ในขณะที่ยังคงทำงานด้วยอัตราประสิทธิภาพที่สูงมาก
วิธีนี้ใช้การวนซ้ำO (1 + log N)อัตราที่เพิ่มขึ้นแบบลอการิทึมโดยมีจำนวนการทำซ้ำ (การเพิ่มจำนวนการทำซ้ำเป็นสองเท่าเท่ากับการซ้ำเพิ่มเติมหนึ่งครั้ง) ซึ่งเป็นการประหยัดอย่างมีนัยสำคัญมากกว่าวิธีอื่น ๆ