If/Else If 与 C# 中的 OR 运算符的性能

Performance of If/Else If versus OR-operator in C#

我对以不同方式格式化基于 OR 的逻辑的性能影响感到好奇,因此我 运行 进行了一个简单但可能有点不科学的测试。我 运行 下面的代码 10 次将 if 语句设置为 true(触发案例 1),10 次将其设置为 false(触发案例 2)。我使用 this site 测试代码并依赖其报告的“绝对 运行ning 时间”。

我得到的结果是Case 1平均用了0.354秒达到运行,而Case 2平均用了0.442秒达到运行。这些数字各自相当一致 - 在案例 1 中,它们在 0.04 的 运行ge 范围内变化,在案例 2 中,它们在 0.09 的 运行ge 范围内变化,并且根本没有重叠,所以看起来乍一看是明显的区别。

两种情况下计数器的结果相同 - 在本例中为 38571428,但我尝试的其他 toCount 值也产生相同的值。我的理解是,如果前面的 if 或 else-if 语句评估为真,则不会评估 else-if 语句,因此从逻辑的角度来看,我认为这两种情况在做同样的事情。

对于为什么案例 1 比案例 2 表现更好,我并没有很好的直觉。有人可以阐明这一点吗?我对一般意义感兴趣,为了更好地理解构建 C# 逻辑的不同方式如何影响性能,所以我希望这个例子也可能理解基本原则,但即使只是解释这个案例看起来很有趣。

int counter = 0;
int toCount = 50000000;
//Case 1
if (false)
{
    for (int iNum = 0; iNum < toCount; ++iNum)
    {
        if (iNum % 2 == 0 || iNum % 3 == 0 || iNum % 5 == 0 || iNum % 7 == 0)
        {
            ++counter;
        }
    }
}
//Case 2
else
{
    for (int iNum = 0; iNum < toCount; ++iNum)
    {
        if (iNum % 2 == 0)
        {
            ++counter;
        }
        else if (iNum % 3 == 0)
        {
            ++counter;
        }
        else if (iNum % 5 == 0)
        {
            ++counter;
        }
        else if (iNum % 7 == 0)
        {
            ++counter;
        }
    }
}
Console.WriteLine("Result: " + counter.ToString());

if 语句和 or 语句各有利弊,if 语句是如果发生这种情况就做这个,or 语句就像说做这个或那个,你让计算机在两个 for or 语句之间做出决定。试着用简单的英语或任何你的母语来写你的代码,这样就很简单了。

视情况而定。您必须彻底对您的特定用例进行基准测试。但是,在不知道细节的情况下,我会说:两者都没有

首先检查在 sharplap.io 处生成的 IL 代码 and/or JIT Asm。它应该给你一些提示。看起来 Case1 产生更小的代码大小。这可能会影响优化期间的内联。

您也可以尝试使用四个独立的 for 循环来最大限度地提高性能。这完全取决于 CPU 缓存。之前已经讨论过这个概念。我建议你阅读这些 answers/discussions:

  • Two loop bodies or one (result identical)
  • Performance of breaking apart one loop into two loops