平台:x32上的.NET Framework 3.5 SP1
是否存在关于在代码中留下空语句(“;”,单独)的性能问题?
要标记为答案,你还会教一个男人(我和其他读这篇文章的人)钓鱼吗?意思是,如何弄清楚它是否存在性能问题?
答案 0 :(得分:14)
1)使用像ildasm或.NET Reflector这样的工具查看生成的程序集内部,并查看IL指令与“;”的关联。空语句(如果有的话;它们可能会被优化为无效。)
2)使用分析器运行一个巨大的循环,其中一些“;”包含在其他代码中,然后在没有“;”的情况下尝试它,看看是否存在差异。
(如果不做其中任何一项,我会非常打赌它会被优化掉并且不产生IL(或某种无操作指令 - 请原谅我的IL无知。)
答案 1 :(得分:6)
空语句产生nop IL代码,因此您可以拥有任意数量的JIT编译器删除它们。
答案 2 :(得分:2)
衡量性能的最简单方法是编写代码并在计时时多次运行。
至于这种情况,我不相信你会因为空行而失去任何代码性能,但是,它可能会影响你的编译时间,(虽然可以忽略不计)。
答案 3 :(得分:1)
查看是否存在性能问题(因为我认为不存在)的最简单方法是运行调试器并查看该行是否已执行。如果它被执行,尝试进入该语句后面的程序集,因为这将指示该语句产生多少指令。但是很可能,这是一个无操作,只是一个时钟滴答。
答案 4 :(得分:1)
作为测试效果的另一种方法:
从:
开始// breakpoint here
int breakpoint1 = 0;
for (int i = 0; i <= 1000; i++)
{
// test operation here
;
}
// breakpoint here
int breakpoint2 = 0;
运行到第一个断点,然后按F5并计入您的头部。如果它太快,则将循环更改为10,000并再次尝试。如果它太快将其增加到100,000并再试一次。
答案 5 :(得分:0)
我无法想象编译器不会简单地优化空语句的任何情况。除了“什么都不做”之外,它肯定不会生成除了“除之外”之外的任何指如果你认为这有一个性能问题,那么很有可能它是别的。
答案 6 :(得分:0)
我预计性能不会受到影响。
您可以通过检查生成的带有和不带空语句的C#程序的IL代码来检查这一点。您可以使用.NET反射器(www.redgate.com)来检查IL。如果生成相同的IL,则不会有性能损失。
答案 7 :(得分:0)
本着教你钓鱼的精神,
1)检查装配,如建议
2)运行一个大循环&amp;时间(手表是一个非常好的工具)
3)在反汇编窗口中单步执行(类似于1)。
如果你担心性能,那么错误的做法就是开始猜测语言结构。正确的做法是诊断,并让程序告诉你什么是花时间,如