在.NET中,是否会优化空方法调用?

Kar*_*uin 23 .net performance

给定一个空方法体,JIT会优化调用(我知道C#编译器不会).我怎么去发现?我应该使用什么工具以及我应该在哪里寻找?

由于我确信它会被问到,因此空方法的原因是预处理器指令.


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

@Jon:这只是告诉我语言编译器没有做任何事情.我想我需要做的是通过ngen运行我的dll并查看程序集.

Kev*_*Kev 13

这个章节对JIT优化有很好的处理,在页面上搜索'方法是空的',它大约是文章的一半 -

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

显然,通过内联实际上没有代码的内容,可以优化空方法.

@Chris:我确实意识到这些方法仍然是二进制文件的一部分,这些是JIT优化:-).在一个半相关的说明中,Scott Hanselman在发布构建调用堆栈中有一篇关于内联的非常有趣的文章:

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


Kei*_*ith 13

我猜你的代码是这样的:

void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
    //your code
#endif
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会得到优化:

partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif
Run Code Online (Sandbox Code Playgroud)

第一个空方法是部分的,C#3编译器将优化它.


顺便说一下:这基本上是部分方法的用途.Microsoft向他们的Linq设计人员添加了代码生成器,他们需要调用默认情况下不执行任何操作的方法.

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

这样,如果不使用部分并且没有性能丢失,则部分被完全优化,而不是增加额外的空方法调用的开销.

  • 使用属性[Conditional(“ COMPILER_FLAG”)]将具有相同的效果,并且可能更易于使用。请参阅http://msdn.microsoft.com/en-us/library/4xssyw96.aspx (2认同)

Chr*_*ith 2

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

  • 该方法可以从派生类调用,也许在不同的程序集中
  • 该方法可以使用反射来调用(即使它被标记为私有)

编辑:是的,从查看那个(优秀的)代码项目文档来看,JITer 将消除对空方法的调用。但由于我列出的原因,这些方法本身仍将被编译并成为二进制文件的一部分。