我找到了this question种优化尾部递归的语言.为什么C#不尽可能优化尾部递归?

For a concrete case, why isn't this method optimized into a loop (Visual Studio 2008 32-bit, if that matters)?:

private static void Foo(int i)
{
    if (i == 1000000)
        return;

    if (i % 100 == 0)
        Console.WriteLine(i);

    Foo(i+1);
}

推荐答案

JIT编译是一个复杂的平衡过程,既要在编译阶段花费太多时间(从而大大降低短期应用程序的速度),又要在标准提前编译的情况下进行足够的分析,以保持应用程序的长期竞争力.

有趣的是,这NGen个编译步骤的目标并不是更积极地进行优化.我怀疑这是因为他们只是不想有bug,因为行为依赖于机器代码是由JIT还是NGN负责的.

CLR本身确实支持尾部调用优化,但特定于语言的编译器必须知道如何生成相关的opcode,JIT必须愿意尊重它.

请参阅this blog post了解一些细节(考虑到最近的JIT变化,现在很可能已经过时).请注意,CLR将更改为4.0 the x86, x64 and ia64 will respect it.

.net相关问答推荐

为什么DotNet新的webapi;命令会为我生成不同的文件夹

通过交互服务器渲染模式和流渲染的组合防止双重渲染

如何使用AWS Lambda函数制作网络挂钩?

如何将 select 语句详细信息提取到不同的方法中仍然保持Eager 加载?

使用 Task.WhenAll 但需要跟踪每个单独的 Task 的成功

类似于字典但没有值的 C# 数据 struct

StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

.gitignore 和 Visual Studio 项目:忽略 bin/Debug 目录但不忽略 bin/Release 目录

支持 HTTPS 的 Httplistener

C# 属性实际上是方法吗?

C# 编译为 32/64 位,或任何 cpu?

获取 .NET 程序集的 AssemblyInformationalVersion 值?

设置 System.Drawing.Color 值

Linq to SQL - 返回前 n 行

Dispatcher.CurrentDispatcher 与 Application.Current.Dispatcher

.NET 配置文件 configSource 在应用程序目录文件夹之外

String.Join 与 StringBuilder:哪个更快?

通过反射查找可空属性的类型

在 try/catch/finally 中等待的一个很好的解决方案?

从 bcp 客户端接收到 colid 6 的无效列长度