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