2013-11-23 34 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。 您還必須考慮分支預測和緩存。這樣的微觀優化只會阻礙你編寫好的代碼。 你會花費更多的時間來優化無用的東西,而不是花時間在軟件中實現好的功能......

想想看,如果你的代碼中有一個設計錯誤。 例如使用不合適的數據結構(例如,用於「快速」查找而不是字典的列表)。