在循环中使用Else语句会导致性能下降吗?

Fak*_*DIY 0 c# performance loops if-statement

我正在用c#编写蒙特卡罗模拟,我正在努力确保编写尽可能高效的代码 - 我正在运行数十亿个循环,而且事情变得越来越慢.我有一个关于Else在循环中使用语句的问题.

我的问题是:这两种方法的性能有什么不同吗?在第一个我使用If-Else语句,在第二个我省略了Else,因为If案例非常罕见.

编辑:假设我需要做的不仅仅是在满足条件时分配true/false,因此直接赋值不是唯一需要完成的事情.if-Else方式的执行速度是否同样快?

       //METHOD 1
 ...       
            for (int index = 0; index < 6; index++)
            {
                for (int x = 0; x < 50; x++)
                {
                    for (int y = 0; y < 50; y++)
                    {


                        bool ThingWhichIsVeryRarelyTrue = SomeFunction(index,x,y);
                        if (ThingWhichIsVeryRarelyTrue)
                        {
                            BooleanAnswerArray[index][x][y] = true;
                            DoSomeOtherStuff();
                        }
                        else
                        {
                            BooleanAnswerArray[index][x][y] = false;
                        }
                    }
                }
            }
    ...
    //METHOD 2
    for (int index = 0; index < 6; index++)
            {
                for (int x = 0; x < 50; x++)
                {
                    for (int y = 0; y < 50; y++)
                    {
                        BooleanAnswerArray[index][x][y] = false;
                        bool ThingWhichIsVeryRarelyTrue = SomeFunction(index,x,y);
                        if (ThingWhichIsVeryRarelyTrue)
                        {
                            BooleanAnswerArray[index][x][y] = true;
                            DoSomeOtherStuff();
                        }
                    }
                }
            }
...
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 5

在您的样本中,直接分配应该非常好:

 BooleanAnswerArray[index][x][y] = SomeFunction(index,x,y);
Run Code Online (Sandbox Code Playgroud)

旁注:尝试缓存数组访问可能是个好主意 - 应该能够缓存,var row = BooleanAnswerArray[index][x]以避免在最内层循环中进行额外的索引.

关于if/else的更新问题:

首先 - 这是性能问题所以必须测量不同的选项,看看代码是否符合目标.Stopwatchclass通常足以进行这种本地化的性能比较,否则可能需要分析器.

猜测

  • if 无论是否有一个或两个分支,特别是在存在任何其他非平凡的代码(如非内联函数调用)时,都会产生完全相同的影响.
  • 循环展开可能会产生更大的影响(也会降低代码的可读性)
  • 尽可能地缓存可能会产生更大的影响