给定一个空方法体,JIT会优化调用(我知道C#编译器不会)。我怎么去发现?我应该使用什么工具?我应该在哪里看?
因为我确信它会被问到,所以空方法的原因是预处理器指令。
@克里斯: 有道理,但它可以优化对方法的调用。因此该方法仍然存在,但可以删除(或至少内联...)
的静态调用@乔恩: 这只是告诉我语言编译器什么都不做。我想我需要做的是通过ngen运行我的dll并查看程序集。
答案 0 :(得分:12)
这个章节对JIT优化有很好的处理,在页面上搜索'方法是空的',它大约是文章的一半 -
http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx
显然,通过内联实际上没有代码的内容,可以优化空方法。
@Chris:我确实意识到方法仍然是二进制文件的一部分,这些是JIT优化:-)。在一个半相关的说明中,Scott Hanselman在Release构建调用栈中有一篇很有趣的文章:
答案 1 :(得分:10)
我猜你的代码就像:
void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
//your code
#endif
}
然而,这不会得到优化:
partial void DoSomethingIfCompFlag();
#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
//your code
}
#endif
第一个空方法是部分的,C#3编译器会优化它。
顺便说一下:这基本上是部分方法的用途。 Microsoft向他们的Linq设计人员添加了代码生成器,他们需要调用默认情况下不执行任何操作的方法。
不要强迫你重载方法,而是可以使用partial。
这样,如果不使用部分并且不会丢失性能,则部分会完全优化,而不是增加额外空方法调用的开销。
答案 2 :(得分:2)
不,空方法永远不会被优化掉。以下是几个原因:
编辑:是的,通过查看那个(优秀的)代码项目文档,JITer将消除对空方法的调用。但由于我列出的原因,方法本身仍然会被编译并成为二进制文件的一部分。
答案 3 :(得分:1)
一切都是平等的,是的,应该进行优化。 JIT在适当的地方内联函数,并且几乎没有比空函数更合适的东西:)
如果你真的想确定然后更改空方法以抛出异常并打印出它包含的堆栈跟踪。
答案 4 :(得分:0)
@Jon Limjap:我们已经知道C#编译器没有优化空方法。因为你用ildasm反编译的是由C#编译器生成的......没有帮助。