2013-11-23 32 views
3

我只是试图确定每个“if”语句对我的C#应用​​程序的性能的影响,当它在具有大量迭代的循环中使用时。我还没有找到关于这个话题,所以我创建了这个话题。如果语句性能在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毫秒 与if:742毫秒

这意味着单个“if”语句带来差不多5倍的性能下降。我认为这会有所帮助。

此外,我已经注意到,在一个大循环中存在几个额外的“if”可能会使我的最终应用程序减慢25%,这对我来说意义重大。

具体而言,我对一组数据执行蒙特卡罗优化,这需要整个数据集中的很多循环。循环包含取决于用户设置的分支。从这一点“如果”出现。

我的问题在性能方面的专业人士:

  1. 什么是额外的运行多次迭代的时间循环的影响,“如果” S?
  2. 如何避免放缓?

如果我走错了方向,请发表您的意见。

+0

您正在确定每隔500000000条if语句的影响。 –

+3

这些代码示例是两个不同的代码,一个是布尔赋值,另一个是条件语句,因此这不是评估性能的合适方法。 – saeed

+2

不要挂上这样的微观优化。无论如何,编译器可能会优化大量的代码。您无法在调试模式下可靠地进行性能测试。使用用户期望后,在整个程序中使用外部工具完成最佳性能测试 – Sico

回答

10

没关系合适的方法...... 你正在测试500百万次迭代...并且花费不到一秒...在最坏的情况下...在最坏的情况下...

正如评论所说,你会处于一个麻烦地开始,因为你不会在调试中运行测试性能,即使如此,您还会有其他需要考虑的事情(这是一个关于性能测试的整个大世界,并不像通常那样简单)。

现在,请注意你在两个地方做了两件不同的事情。如果你想看看if的表现,你应该让他们的表现基本一致。我敢肯定分支改变IL代码开始...

最后但并非最不重要的,因为我再次说...它不是最重要的...除非你真的需要运行500万次,并且在很多地方都有这样的情况,所以你的程序开始因此而放慢速度。

转到以提高可读性超过着迷,如果你能够节省一些微秒的if语句

随时通过Eric Lippert阅读这些文章(谁拥有“唯一” 250K代表,并为在C#中的主要开发者编译器团队:)谁会让你在正确的方向:

(说到这里,我猜想,垃圾收集(第4条)可能是要考虑的事情...)

然后看看:this elaborate answer about the topic

而且最后但并非最不重要的,看看Writing Faster Managed Code: Know What Things Cost。这是来自Microsoft CLR性能团队的Jan Gray。我会诚实地说,我没有看到这一个 :)。我会虽然,后来就......

它去上上... :)

+0

我喜欢你的答案谢谢你的努力 – saeed

+0

谢谢你的好系列。总是乐于帮助和分享wisdow :) – Noctis

+1

@Noctis 1)我确实需要数百万次迭代(我对一组数据运行一些优化过程)2)正如我所提到的,我运行在释放模式3)在我的最终申请是在循环中出现几个“如果”会带来25%的总体减速,在我看来这是很大的。非常感谢您的好链接。 – Kudral

2

这些代码示例是两个不同的代码中的一个是布尔分配,另一种是条件语句,因此这不是评估性能

1

这些基准告诉你,基本上什么都没有。 有更多的事情在发挥作用,而不仅仅是一个额外的if。 您还必须考虑分支预测和缓存。这样的微观优化只会阻碍你编写好的代码。 你会花费更多的时间来优化无用的东西,而不是花时间在软件中实现好的功能......

想想看,如果你的代码中有一个设计错误。 例如使用不合适的数据结构(例如,用于“快速”查找而不是字典的列表)。