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
我对以不同方式格式化基于 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