我有一些关于编码资源的问题:
第一季度:
A:
for (int i = 0; i < 15; i++)
{
FunA(i);
FunB(i);
}
或
B:
for (int i = 0; i < 15; i++)
{
FunA(i);
}
for (int i = 0; i < 15 ; i++)
{
FunB(i);
}
因为有2个循环,B是否比A占用更多资源? 为什么?
第二季度:
A:
FunA(10*2-15+15/X);
FunA(10*2-15+15/X);
FunA(10*2-15+15/X);
B:
int result=10*2-15+15/X;
FunA(result);
FunA(result);
FunA(result);
A占用更多资源是因为每次都要计算结果还是B占用了更多资源?编译器是否理解结果相同并从中得出变量?
答案 0 :(得分:2)
使用探查器。
对于第二个问题,C#编译器将优化诸如10*2-15+15
之类的编译时常量。
第二个B
示例是更好的代码,尽管编译器可能会为您优化A
示例。
除了性能,第二个A
示例只是不好的编码实践。不必要的重复常量(用户出错的机会更大,尤其是以后更改此代码时)。
也就是说,一个好的经验法则是不要依赖编译器优化。尝试使代码可读,并且对于实际上 恒定的内容,您应该从字面上将它们定义为const
:
const int WHATEVER = 10 * 2 - 15 + 15;
int result = WHATEVER / X;
FunA(result);
FunA(result);
FunA(result);
最后,这里有必要提到的是,剖析几乎总是比滚动自己的基准测试更准确(我发现该基准测试多次写错了很多次)。 Visual Studio 2017具有内置的探查器,或者您可以在其中使用各种其他探查器。
对性能有疑问时,请不要猜测。获取实际指标。