Để sử dụng chung, các giải pháp liên quan đến lớp StringBuilder là tốt nhất để lặp lại các chuỗi nhiều ký tự. Nó được tối ưu hóa để xử lý sự kết hợp của một số lượng lớn các chuỗi theo cách mà việc nối đơn giản không thể và điều đó sẽ khó hoặc không thể thực hiện hiệu quả hơn bằng tay. Các giải pháp StringBuilder hiển thị ở đây sử dụng các lần lặp O (N) để hoàn thành, tỷ lệ cố định tỷ lệ với số lần lặp lại.
Tuy nhiên, đối với số lần lặp lại rất lớn hoặc ở mức độ hiệu quả cao phải được vắt kiệt, cách tiếp cận tốt hơn là làm một cái gì đó tương tự như chức năng cơ bản của StringBuilder nhưng để tạo ra các bản sao bổ sung từ đích, thay vì từ chuỗi gốc, như sau.
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);
}
Điều này làm tăng gấp đôi độ dài của chuỗi nguồn / đích với mỗi lần lặp, giúp tiết kiệm chi phí đặt lại bộ đếm mỗi lần nó đi qua chuỗi ban đầu, thay vào đó đọc trơn tru và sao chép chuỗi dài hơn nhiều, điều mà các bộ xử lý hiện đại có thể làm được nhiều hiệu quả hơn.
Nó sử dụng logarit cơ sở 2 để tìm số lần cần gấp đôi độ dài của chuỗi và sau đó tiến hành làm như vậy nhiều lần. Vì phần còn lại sẽ được sao chép ít hơn tổng chiều dài mà nó được sao chép, nên sau đó có thể chỉ cần sao chép một tập hợp con của những gì nó đã tạo.
Tôi đã sử dụng phương thức Array.Copy () qua việc sử dụng StringBuilder, vì việc sao chép nội dung của StringBuilder vào chính nó sẽ có chi phí sản xuất một chuỗi mới với nội dung đó với mỗi lần lặp. Array.Copy () tránh điều này, trong khi vẫn hoạt động với hiệu suất cực kỳ cao.
Giải pháp này cần hoàn thành các lần lặp O (1 + log N) , tốc độ tăng logarit với số lần lặp lại (nhân đôi số lần lặp lại bằng một lần lặp bổ sung), tiết kiệm đáng kể so với các phương pháp khác, tăng tỷ lệ thuận.