在循环条件下使用数学类方法是否缓慢?

Sup*_*dge 0 c# methods conditional loops

如果我有一个for循环的例子,并且我想使用类似Math.round()的东西来舍入数字,但我只需要将数字四舍五入(即数字在整个循环中没有变化)是否更好将它存储到变量中,然后在条件中使用变量或者无关紧要?

 for (int i = 0;i < Math.Round(x);i++)
   {
   //Some code  
   }
Run Code Online (Sandbox Code Playgroud)

VS

 for (int i = 0,roundedX = Math.Round(X); i<roundedX;i++)
  {  
  //Some code 
  }
Run Code Online (Sandbox Code Playgroud)

ang*_*son 8

编译器将在每次循环迭代时评估终止条件.

如果编译器和JITter 认为它是不变的,那么它可能会在循环外部提升某个表达式或部分表达式,这意味着它不会改变.然而,这通常只用更简单的表达式来完成.

如果Math.Round(X)表达式可以在没有实际方法调用的情况下完成,那么也许在这种特殊情况下,舍入将在每次循环迭代时发生.

因此,如果您在性能问题上处于最后防线,您可以考虑将其移出并转换为变量:

int goal = (int)Math.Round(X);
for (int i = 0; i < goal; i++)
    ...
Run Code Online (Sandbox Code Playgroud)

因为这只会调用Math.Round一次方法,所以只能获得一次性能.

请注意,如果将X更改作为循环的一部分,那么显然您希望保留原始代码.

  • 我说"性能打击",但很可能这对你的表现几乎没有影响.除非你在循环中做很小的工作负载,并且具有非常高的最终值,否则我可能不会为此烦恼. (2认同)