You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#基准测试中BuildString方法无内存分配?

问题描述

运行以下C#基准测试代码时,BuildString方法未检测到任何内存分配,这与“字符串会在堆上分配”的认知冲突:

[MemoryDiagnoser]
public class StringBenchmark
{
    [Benchmark]
    public string BuildString()
    {
        return "Test";
    }

    [Benchmark]
    public string BuildStringUsingStringConcatenationMethod()
    {
        return string.Concat("Hello", 2022, "/", 5);
    }
}

基准测试结果:

MethodMeanErrorStdDevGen0Allocated
BuildString0.0000 ns0.0000 ns0.0000 ns--
BuildStringUsingStringConcatenationMethod60.0764 ns0.4336 ns0.3385 ns0.0286240 B
原因解释
  • "Test"属于字符串字面量,.NET会自动将这类字符串存入字符串驻留池——这是程序启动时就初始化的进程级内存区域,核心作用是复用相同的字符串字面量,避免重复分配内存。
  • BuildString方法只是返回驻留池中已存在的字符串引用,没有创建新的字符串对象,因此基准测试不会检测到额外内存分配,执行耗时也趋近于0。
  • 而string.Concat需要动态拼接不同类型的内容(字符串、整数),必须创建新的字符串对象来存储拼接结果,所以会在堆上分配内存,对应测试结果里的Gen0和Allocated数值。

补充说明:只有动态生成的字符串(比如运行时拼接、代码动态创建的)才会在堆上分配新内存;若要让这类字符串也实现内存复用,可以手动调用string.Intern方法将其加入驻留池。

内容的提问来源于stack exchange,提问作者Konrad S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:17:06