【问题标题】:Does StringBuilder in .net 4.5 have chunks larger than MaxChunkSize.net 4.5 中的 StringBuilder 的块是否大于 MaxChunkSize
【发布时间】:2014-11-18 15:30:34
【问题描述】:

在 .net 4.5 CLR 团队中,StringBuilder 类发生了很大变化。 HereStringBuilder 类的代码参考。在这里我们可以找到MaxChunkSize等于8000并在该字段上方进行评论:

// We want to keep chunk arrays out of large object heap (< 85K bytes ~ 40K chars) to be sure.
// Making the maximum chunk size big means less allocation code called, but also more waste
// in unused characters and slower inserts / replaces (since you do need to slide characters over
// within a buffer).  

所以我仍然想知道,我们是否会使用 StringBuilder 附加大字符串,例如:

var sb = new StringBuilder();
sb.Append(<<Here comes the string with length larger than 80 000 symbols>>);

我们还会在 LargeObjectHeap 中分配 ChunksArrays 吗?

【问题讨论】:

    标签: append stringbuilder chunks large-object-heap


    【解决方案1】:

    我的直觉告诉你,你还是会因为大弦本身而被 LOH 标记;如果您的字符串大于限制,它仍会存在于 LOH 中,尽管 StringBuilder 不会。

    让我们测试一下:

    void Main()
    {
        var big_ass_string = new String('a', 80001);
        var sb = new StringBuilder();
        sb.Append(big_ass_string);
        var generation_of_builder = GC.GetGeneration(sb);
        var generation_of_string = GC.GetGeneration(big_ass_string);
        Console.WriteLine("StringBuilder is in gen:{0}", generation_of_builder);
        Console.WriteLine("String is in gen:{0}", generation_of_string);
    }
    

    输出:

    StringBuilder is in gen:0
    String is in gen:2
    

    【讨论】:

      【解决方案2】:

      答案是肯定的(即使在 .NET 4.5 或更高版本中):每次调用 sb.Append(...some string larger than 40K chars...); StringBuilder 都会在大对象堆上分配。 (因此,破坏了 StringBuilder 的“新”设计的目的。)我在这里发布了更详细的信息和可能的修复: https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-28
        • 2013-02-13
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多