Khi tôi trống rỗng StringBuilder
với dung lượng 5 và tôi viết "hello, world!" với nó, tiêu chuẩn C# có chỉ định dung lượng mới của StringBuilder
không? Tôi có một bộ nhớ mơ hồ rằng nó gấp đôi chiều dài của chuỗi mới (để tránh thay đổi dung lượng với mỗi chuỗi nối mới).Dung lượng của StringBuilder thay đổi như thế nào?
Trả lời
Phụ thuộc phiên bản .NET bạn đang nói đến. Trước .NET 4, StringBuilder sử dụng standard .NET strategy, tăng gấp đôi công suất của bộ đệm bên trong mỗi khi nó cần được mở rộng.
StringBuilder được viết lại hoàn toàn cho .NET 4, hiện đang sử dụng ropes. Mở rộng việc phân bổ bây giờ được thực hiện bằng cách thêm một đoạn dây khác lên tới 8000 ký tự. Không hoàn toàn hiệu quả như chiến lược trước đó nhưng tránh rắc rối với các bộ đệm lớn làm tắc nghẽn Heap đối tượng lớn. Mã nguồn có sẵn từ Nguồn tham khảo nếu bạn muốn xem xét kỹ hơn.
Nó gây rối cho chúng tôi khi chúng tôi nâng cấp sản phẩm của mình từ .Net 3.5 lên .Net 4.5. Chúng tôi đã sử dụng đối tượng trình xây dựng chuỗi làm tham số cho cuộc gọi API gốc thông qua interop. Nó dẫn đến vấn đề tràn bộ đệm gây ra quá trình sụp đổ. Heap bộ nhớ đã bị hỏng khi API bản địa đã trở về chuỗi dài.Chúng tôi bắt đầu cung cấp năng lực rõ ràng trong constructor để bộ đệm có thể chăm sóc dây dài. Đáng ngạc nhiên nó cần phải được phá vỡ trước đó cũng cho chuỗi dài nhưng không bao giờ được báo cáo. thực hiện một số thủ thuật trong .Net 3.5 khi chúng ta sử dụng trình xây dựng chuỗi làm bộ đệm cho các API gốc? – RBT
Điều đó làm hỏng heap GC trong cả hai phiên bản thời gian chạy. Tham nhũng như vậy không nhất thiết phải được phát hiện, bạn phải may mắn. Chắc chắn, bạn có xu hướng để có được may mắn hơn trong. NET 4 –
Chuẩn C# sẽ không chỉ định hành vi của một lớp thư viện BCL vì nó không liên quan gì đến đặc tả ngôn ngữ.
Theo như tôi biết, hành vi thực tế không được xác định trong bất kỳ đặc điểm kỹ thuật nào và thực hiện cụ thể.
AFAIK, Việc triển khai MS sẽ tăng gấp đôi dung lượng khi đạt được dung lượng hiện tại.
Xem this và this câu hỏi SO trước đó.
Cập nhật:
này đã được thay đổi trong .NET 4.0. như được mô tả bởi Hans trong his answer. Bây giờ ropes được sử dụng, bổ sung thêm 8000 ký tự cùng một lúc.
MSDN, tuy nhiên là rất cẩn thận để chỉ ra rằng các hành vi thực tế là thực hiện cụ thể:
Các StringBuilder động phân bổ thêm không gian khi cần thiết và tăng công suất cho phù hợp. Vì lý do hiệu suất, một StringBuilder có thể cấp phát bộ nhớ nhiều hơn mức cần thiết. Lượng bộ nhớ được cấp phát cụ thể cho việc triển khai thực hiện.
Chúng tôi không còn sử dụng chiến lược tăng gấp đôi khi toàn bộ. –
@Eric - Cảm ơn bạn đã sửa tôi. Điều đó và câu trả lời từ Hans đã cho tôi biết thêm chi tiết. – Oded
New StringBuilder (NET 4.5 hoặc cao hơn) phân bổ một bộ đệm nội m_ChunkChars
theo yêu cầu của thông số công suất:
public StringBuilder(int capacity) { ... m_ChunkChars = new char[capacity]; ... }
Vì vậy, nếu công suất nhỏ hơn 40K chars nó đi vào Object nhỏ Heap. Tuy nhiên (trái với niềm tin phổ biến), StringBuilder sẽ vẫn phân bổ trên Heap đối tượng lớn nếu, sau đó, chúng tôi gọi sb.Append(...some string larger than 40K chars...);
Có thể tìm thấy bản sửa lỗi có thể tìm thấy tại đây: https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder
Điều này không có gì ở tất cả để làm với những gì câu hỏi được yêu cầu. – Servy
- 1. Đếm và Dung lượng nhanh như thế nào?
- 2. Chuỗi StringBuilder có thay đổi không?
- 3. Bạn thay đổi kích thước của ImageView như thế nào?
- 4. Thay thế Regex bên trong một StringBuilder
- 5. Haskell đã thay đổi như thế nào?
- 6. Dung lượng của uint64_t?
- 7. Kích thước dung lượng ban đầu hiệu quả nhất cho StringBuilder?
- 8. Thay đổi dung lượng mặc định/hệ số tải của scala mutable.HashMap
- 9. Thay đổi nội dung của div - jQuery
- 10. Liệu std :: vector.pop_back() có thay đổi dung lượng của vector không?
- 11. Trình quản lý lưu trữ kiểm tra nội dung không thay đổi so với nội dung đã thay đổi như thế nào?
- 12. Animate thay đổi chiều cao của div khi nội dung của nó thay đổi
- 13. Gson: Làm thế nào để thay đổi sản lượng của Enum
- 14. Dung lượng sử dụng bộ nhớ chia sẻ Azure được tính như thế nào?
- 15. Làm thế nào để bạn thay đổi kích thước nội dung văn bản của Silverlight?
- 16. StringBuilder và byte chuyển đổi
- 17. Làm thế nào để cắt chuỗi StringBuilder?
- 18. WPF: FlowDirection.RightToLeft thay đổi chuỗi như thế nào?
- 19. Làm thế nào để thay đổi nội dung của một phần tử span trong JavaScript
- 20. NHibernate thực hiện theo dõi thay đổi như thế nào?
- 21. Facebook, cách thay đổi hình ảnh nút như thế nào?
- 22. StringBuilder: làm thế nào để có được chuỗi cuối cùng?
- 23. Lớp chuỗi Python như StringBuilder trong C#?
- 24. Tôi nên thăm dò ý kiến số lượng lớn các tệp để thay đổi như thế nào?
- 25. StringBuilder khởi trong Java
- 26. Thay đổi âm lượng của chương trình trên Win 7
- 27. thay đổi nội dung chặn
- 28. Làm thế nào để lực lượng tiết kiệm như hộp thoại trong firefox bên cạnh việc thay đổi tiêu đề?
- 29. Có bao nhiêu vấn đề nếu tôi tạo NSMutableArray với dung lượng = 3 thay vì dung lượng = 50?
- 30. AppBarButtonStyle: Thay đổi nội dung từ mã
Điều này không được quy định trong bất kỳ tiêu chuẩn nào – BrokenGlass
StringBuilder không phải là một phần của ngôn ngữ C#. Nó là một phần của thư viện .net. –
có thể trùng lặp của [StringBuilder quyết định dung lượng của nó như thế nào?] (Http://stackoverflow.com/questions/4495855/how-does-the-stringbuilder-decide-how-large-its-capacity-should -be) – bzlm