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

C#编译器是否会折叠返回常量的函数?附BenchmarkDotNet测试代码

C#编译器是否会折叠返回常量的函数?

首先直接给你答案:C#的JIT编译器确实会对返回常量的函数进行折叠优化,尤其是你代码里这种简单的局部函数场景。

咱们先来看你提供的测试代码:

public class OutVsTuple 
{ 
    [Benchmark] 
    public void Out() 
    { 
        void OutLocal(out int a, out int b) { a = 1; b = 2; } 
        OutLocal(out int x, out int y); 
        int z = x + y; 
    } 

    [Benchmark] 
    public void Tuple() 
    { 
        (int a, int b) TupleLocal() => (1,2); 
        (int x, int y) = TupleLocal(); 
        int z = x + y; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
        BenchmarkRunner.Run<OutVsTuple>(); 
    } 
}

具体的优化逻辑

你的两个测试方法里,局部函数都是直接返回固定常量值,没有任何依赖外部状态的逻辑。在Release模式下(BenchmarkDotNet默认使用该模式执行测试),JIT编译器会执行以下优化:

  • 完全消除局部函数的调用开销,直接把常量值1和2赋值给对应的变量x和y
  • 甚至可能进一步优化x + y的计算,直接把z替换成常量3

这意味着最终生成的机器码里,两个Benchmark方法的逻辑几乎完全一致,所以它们的性能表现应该没有明显差异。

验证优化的方式

如果你想亲眼确认这个优化效果,可以给你的测试类加上[DisassemblyDiagnoser]特性,让BenchmarkDotNet生成对应的机器码反汇编结果。你会看到局部函数的调用指令已经完全消失,只剩下常量赋值和简单的加法操作。

内容的提问来源于stack exchange,提问作者5argon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:38:35