2015-05-18 53 views
1

我在兩個項目中看似完全相同的C#代碼基準測試存在問題。在兩個項目中具有不同性能的相同方法

該代碼是一個C#實現的繞數算法,以確定點是否在多邊形內。

該列表是頂點有序列表,其經度爲緯度&。從每個頂點繪製一條線時,按順序繪製一個多邊形,然後該方法確定該點是否位於多邊形的內部。

下面是代碼:

public static bool IsPointInPolygon(List<Vertex> polygon, Vertex point) 
{ 
    int wn = 0; 
    for (int i = 0; i < (polygon.Count - 1); i++) 
    { 
     if (polygon[i].Latitude <= point.Latitude) 
     { 
      if (polygon[i + 1].Latitude > point.Latitude) 
      { 
       if (IsLeft(polygon[i], polygon[i + 1], point) > 0) 
        wn++; 
      } 
     } 
     else 
     { 
      if (polygon[i + 1].Latitude <= point.Latitude) 
      { 
       if (IsLeft(polygon[i], polygon[i + 1], point) < 0) 
        wn--; 
      } 
     } 
    } 
    return wn != 0; 
} 

private static double IsLeft(Vertex lineStart, Vertex lineEnd, Vertex point) 
{ 
    return ((lineEnd.Longitude - lineStart.Longitude) * (point.Latitude - lineStart.Latitude) 
     - (point.Longitude - lineStart.Longitude) * (lineEnd.Latitude - lineStart.Latitude)); 
} 

這裏是我的頂點類:

public class Vertex 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
    public int Order { get; set; } 

    public Vertex(double latitude, double longitude) 
    { 
     this.Latitude = latitude; 
     this.Longitude = longitude; 
    } 

    public Vertex(double latitude, double longitude, int order) 
    { 
     this.Latitude = latitude; 
     this.Longitude = longitude; 
     this.Order = order; 
    } 
} 

這裏是我用了這兩個項目的基準代碼(我使用的是併發袋,因爲我在「*****」中並行處理):

System.Collections.Concurrent.ConcurrentBag<double> times = new System.Collections.Concurrent.ConcurrentBag<double>(); 
// ***** 
// ***** 
var start = DateTime.Now; 
bool isPointInPoly = IsPointInPolygon(poly, point); // where poly is a List<Vertex> and point is a Vertex 
var end = DateTime.Now; 
times.Add((end - start).TotalMilliseconds); 
// ***** 
// ***** 
Debug.WriteLine(times.Average()); 

在一個解決方案中,平均時間I返回大約爲0.007 ms,但在另一個大約是0.014 ms的兩倍。

在這兩種解決方案中,我傳遞了一個相同的數據集,兩個List的順序相同,並且整個方法(稱爲多次)以相同順序調用。

我的解決方案在「調試」和「發佈」中進行了比較,並且都與「優化代碼」標誌集進行了比較,所有測試中性能差異的比率相同。

你能否提出一些我可以調整/調查的其他設置/代碼問題,以便找出性能差異的原因?另外,如果您需要更多信息,請告訴我,我會提供。

更新: 我對這兩個項目都運行了Visual Studio性能分析。這裏是慢版:

http://i.imgur.com/kQamIUD.png

,這裏是快速的版本:

http://i.imgur.com/UaVNcaM.png

道歉,我不能直接超鏈接的圖片,我沒有10美譽尚未。

回答

4

當您進行基準性能測試時,請勿使用DateTime.Now來追蹤已用時間。相反,使用System.Diagnostics.Stopwatch類,它是專爲這個目的和更精確:

var stopwatch = Stopwatch.StartNew(); 

// Execute code 

stopwatch.Stop(); 
long duration = stopwatch.ElapsedMilliseconds; 

你也應該衡量許多執行相同的代碼,而不僅僅是一個單一的一個。很短的執行時間很難精確測量。考慮運行你的代碼一百萬次並比較這些值。

+0

感謝您回覆馬呂斯。我已將計時器更改爲此,但結果相同。此外,我已經對5000 * 2350的進程進行了非常近似的計時,這個計劃剛剛低於1200萬次,其中一個項目的時間約爲20秒,另一個項目的時間約爲40秒。 此外,在我的整個數據集上運行時,性能差異很明顯,所以我認爲問題不在於計時器本身。 –

相關問題