关于性能:在.NET中,是否会优化空方法调用?

关于性能:在.NET中,是否会优化空方法调用?

In .NET, will empty method calls be optimized out?

给出一个空的方法主体,JIT将优化调用(我知道C#编译器不会)。我将如何寻找答案?我应该使用什么工具,在哪里寻找?

因为我确定会被问到,所以空方法的原因是预处理器指令。

@Chris:
是有道理的,但是它可以优化对方法的调用。因此该方法仍然存在,但是可以删除对其的静态调用(或至少是内联的...)

@Jon:
这只是告诉我语言编译器没有执行任何操作。我认为我需要做的是通过ngen运行我的dll并查看程序集。


此章对JIT优化进行了很好的处理,在页面上搜索"方法为空",大约在文章的中间-

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

显然,空方法确实可以通过内联什么没有代码的方法得到优化。

@Chris:我确实意识到这些方法仍将是二进制文件的一部分,并且这些都是JIT优化:-)。在半相关的说明中,Scott Hanselman有一篇非常有趣的文章,涉及内联在Release build调用堆栈中:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx


我猜你的代码是这样的:

1
2
3
4
5
void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
    //your code
#endif
}

这不会得到优化,但是:

1
2
3
4
5
6
7
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

第一个空方法是部分方法,C#3编译器将对其进行优化。

顺便说一句:这基本上是部分方法的用途。微软在其Linq设计器中添加了代码生成器,这些代码生成器需要调用默认情况下不执行任何操作的方法。

您可以使用部分方法,而不是强迫您重载该方法。

这样,如果不使用局部函数,则将完全优化,并且不会损失任何性能,而不是增加额外的空方法调用的开销。


否,永远不会优化空方法。以下是几个原因:

  • 该方法可以从
    派生类,也许在
    不同的组装
  • 该方法可以
    被称为使用反射(即使
    它被标记为私人)

编辑:是的,通过查看该(优秀)代码项目doc,JITer将消除对空方法的调用。但是由于我列出的原因,方法本身仍将被编译为二进制文件的一部分。


所有条件都相同,是的,应该对其进行优化。 JIT内联函数在适当的地方,并且没有什么比空函数更合适的了:)

如果您真的想确定,请更改您的空方法以引发异常并打印出其中包含的堆栈跟踪。


推荐阅读