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
相关产品推荐
相关产品推荐

