In .NET, will empty method calls be optimized out?给出一个空的方法主体,JIT将优化调用(我知道C#编译器不会)。我将如何寻找答案?我应该使用什么工具,在哪里寻找? 因为我确定会被问到,所以空方法的原因是预处理器指令。 @Chris: @Jon: 此章对JIT优化进行了很好的处理,在页面上搜索"方法为空",大约在文章的中间- http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx 显然,空方法确实可以通过内联什么没有代码的方法得到优化。 @Chris:我确实意识到这些方法仍将是二进制文件的一部分,并且这些都是JIT优化:-)。在半相关的说明中,Scott Hanselman有一篇非常有趣的文章,涉及内联在Release build调用堆栈中: http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx 我猜你的代码是这样的:
这不会得到优化,但是:
第一个空方法是部分方法,C#3编译器将对其进行优化。 顺便说一句:这基本上是部分方法的用途。微软在其Linq设计器中添加了代码生成器,这些代码生成器需要调用默认情况下不执行任何操作的方法。 您可以使用部分方法,而不是强迫您重载该方法。 这样,如果不使用局部函数,则将完全优化,并且不会损失任何性能,而不是增加额外的空方法调用的开销。 否,永远不会优化空方法。以下是几个原因:
编辑:是的,通过查看该(优秀)代码项目doc,JITer将消除对空方法的调用。但是由于我列出的原因,方法本身仍将被编译为二进制文件的一部分。 所有条件都相同,是的,应该对其进行优化。 JIT内联函数在适当的地方,并且没有什么比空函数更合适的了:) 如果您真的想确定,请更改您的空方法以引发异常并打印出其中包含的堆栈跟踪。 |