【发布时间】:2013-12-08 03:18:06
【问题描述】:
我只是想确定每个“if”语句对我的 C# 应用程序性能的影响,当它在具有大量迭代的循环中使用时。我还没有找到关于这个的主题,所以我创建了这个。
对于测试,我做了 2 个循环:一个没有“if”,一个只有一个“if”语句。代码如下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace IfPerformance
{
class Program
{
static void Main(string[] args)
{
int N = 500000000;
Stopwatch sw = new Stopwatch();
double a = 0, b = 0;
bool f;
sw.Restart();
for (int i = 0; i < N; i++)
{
a += 1.1;
f = a < N;
}
sw.Stop();
Console.WriteLine("Without if: " + sw.ElapsedMilliseconds + " ms");
a = 0;
sw.Restart();
for (int i = 0; i < N; i++)
{
if (a < N)
a += 1.1;
else
b += 1.1;
}
sw.Stop();
Console.WriteLine("With if: " + sw.ElapsedMilliseconds + " ms");
Console.ReadKey();
}
}
}
我使用“优化代码”构建选项和“不调试就开始”运行了测试。结果如下: 如果没有:154 毫秒 如果:742 毫秒
这意味着单个“if”语句会使性能降低近 5 倍。我认为这会有所帮助。
另外,我注意到在一个大循环中存在几个额外的“if”可能会使我的最终应用程序减慢 25%,我认为这很重要。
具体来说,我正在对一组数据运行 Monte-Carlo 优化,这需要对整个数据集进行多次循环。循环包含取决于用户设置的分支。从这一点开始出现“如果”。
我在性能方面向专业人士提出的问题是:
- 循环中额外的“if”对运行多次迭代的时间有何影响?
- 如何避免减速?
如果我走错了方向,请发表您的意见。
【问题讨论】:
-
这些代码示例是两个不同的代码,一个是布尔赋值,另一个是条件语句,因此这不是评估性能的合适方法。
-
不要沉迷于这样的微优化。无论如何,编译器可能会优化你的很多代码。您无法在调试模式下可靠地进行性能测试。在您了解用户期望后,使用外部工具对整个程序进行最佳性能测试
-
我添加了布尔赋值来补偿第二个循环中比较操作的时间,并确定纯“if”语句的速度
-
所以您已经确定执行 if 语句需要 1.484 纳秒...
-
在一个好的编译器中,你的代码会立即终止,因为它实际上并没有做任何事情。这使您的基准测试变得非常糟糕,
if语句的成本也很难衡量,因为它在很大程度上取决于分支预测和推测执行对于此特定代码和数据模式的工作情况。但总的来说if相当昂贵,我尽量避免在高性能代码中使用它。
标签: c# .net performance