在循环条件中使用数学 class 方法是否很慢?
Is using a math class method in a loop condition slow?
例如,如果我有一个 for 循环,并且我想使用 Math.round() 之类的东西来舍入数字,但我只需要将数字舍入一次(即数字不会改变在整个循环中)将它存储到一个变量中,然后在条件中使用该变量更好还是无所谓?
for (int i = 0;i < Math.Round(x);i++)
{
//Some code
}
对
for (int i = 0,roundedX = Math.Round(X); i<roundedX;i++)
{
//Some code
}
编译器将在每次循环迭代时评估终止条件。
编译器和 JITter 可能 将某些表达式或表达式的一部分提升到循环外,如果它认为它是不变的,这意味着它不会改变。然而,这通常只用更简单的表达式来完成。
如果 Math.Round(X)
表达式可以在没有实际方法调用的情况下完成,那么 可能 但在这种特殊情况下,舍入将在每次循环迭代时发生。
因此,如果您最终是性能问题的防线,您可以考虑将其移出并放入变量中:
int goal = (int)Math.Round(X);
for (int i = 0; i < goal; i++)
...
由于这只会调用 Math.Round
方法一次,因此您只会受到一次性能影响。
请注意,如果 X
更改 作为循环的一部分 ,那么显然您想保留原始代码。
我建议定义一个变量
var roundedX = Math.Round(X);
for (int i = 0; i < roundedX; i++)
{
//Some code
}
例如,如果我有一个 for 循环,并且我想使用 Math.round() 之类的东西来舍入数字,但我只需要将数字舍入一次(即数字不会改变在整个循环中)将它存储到一个变量中,然后在条件中使用该变量更好还是无所谓?
for (int i = 0;i < Math.Round(x);i++)
{
//Some code
}
对
for (int i = 0,roundedX = Math.Round(X); i<roundedX;i++)
{
//Some code
}
编译器将在每次循环迭代时评估终止条件。
编译器和 JITter 可能 将某些表达式或表达式的一部分提升到循环外,如果它认为它是不变的,这意味着它不会改变。然而,这通常只用更简单的表达式来完成。
如果 Math.Round(X)
表达式可以在没有实际方法调用的情况下完成,那么 可能 但在这种特殊情况下,舍入将在每次循环迭代时发生。
因此,如果您最终是性能问题的防线,您可以考虑将其移出并放入变量中:
int goal = (int)Math.Round(X);
for (int i = 0; i < goal; i++)
...
由于这只会调用 Math.Round
方法一次,因此您只会受到一次性能影响。
请注意,如果 X
更改 作为循环的一部分 ,那么显然您想保留原始代码。
我建议定义一个变量
var roundedX = Math.Round(X);
for (int i = 0; i < roundedX; i++)
{
//Some code
}