2009-10-09 43 views
3

是否有某些原因導致相同的數學運算在一個Silverlight應用程序中比另一個Silverlight應用程序花費的時間要長得多?silverlight數學性能問題

例如,我有一些代碼需要一個點列表並將它們轉換(縮放和轉換它們)並填充另一個點列表。重要的是我保持原始點完好無損,因此是第二個列表。

下面是相關的代碼(規模爲雙和原產地是一個點):

public Point transformPoint(Point point) { 
     // scale, then translate the x 
     point.X = (point.X - origin.X) * scale; 
     // scale, then translate the y 
     point.Y = (point.Y - origin.Y) * scale; 
     // return the point 
     return point; 
    } 

以下是我正在做的循環和時間,在情況下,它是很重要的:

  DateTime startTime = DateTime.Now; 
     foreach (Point point in rawPoints) transformedPoints.Add(transformPoint(point)); 
     Debug.Print("ASPX milliseconds: {0}", (DateTime.Now - startTime).Milliseconds); 

在運行14356點(不要問,它是在桌面應用程序中模擬一個真實的世界數字),故障如下:

Silverlight應用程序#1:46毫秒

Silverlight應用程序#2:859毫秒

第一個應用程序是一個空的應用程序,它在MainPage構造函數中執行循環。第二個是在另一個類的方法中執行循環,我想在GUI線程的事件處理程序中調用該方法。但是,如果考慮到循環內部發生了相同的操作,是否應該考慮這一點?

在線程工作或其他方面我可能缺少一些巨大的東西,但這種差異對我來說根本沒有意義。

+3

請使用System.Diagnostics.StopWatch來測試您的代碼併發布結果。使用DataTime是非常不準確的。 – ParmesanCodice 2009-10-09 21:52:31

+3

另外 - 也許這是顯而易見的 - 確保你在這兩種情況下測量版本構建。 – 2009-10-09 21:54:39

回答

2

除了其他意見和回答我要去的線路有點之間的閱讀。

在第一個應用程序中,您幾乎可以在MainPage構造函數中單獨運行此代碼。 IWO您已經創建了一個新的Silverlight應用程序,並將此代碼放在其中,這就是它。

在第二個應用程序中,你有更多的真實世界的東西。至少你有這個代碼作爲一個簡單的用戶界面的按鈕點擊的結果運行。這就是線索。

拿一個空白的應用程序,並放下一個按鈕。運行它並點擊按鈕,按鈕有什麼作用?有動畫附加到按鈕的視覺狀態。當您單擊按鈕時,此動畫(或其他動畫或循環)可能與您的代碼平行運行。定時器(無論您是否使用StopWatch正確執行)都會記錄已用時間,而不僅僅是您線程的時間。因此,當其他線程正在做其他事情時(比如動畫),你的計時將會關閉。

+0

這是我懷疑的情況。由另一個組件或另一個線程完成的工作正在減慢我的數學運算速度。該頁面上唯一的其他控件是ESRI Silverlight地圖,它也響應導致重繪我的觀點的鼠標移動。但是電腦*真的很快 - 無論它做什麼都不應該消耗太多的處理器時間,它會導致一些相當簡單的數學運算,像它們一樣磨碎...... – Klay 2009-10-12 03:37:23

1

我的第一個懷疑是Silverlight App#2會觸發垃圾回收。縮放〜15,000點應該花費一毫秒,而不是將近一秒。

嘗試減少代碼中的內存分配。轉換點可以是一個數組,而不是一個動態增長的數據結構?

你也可以看看GC performance counters,但簡單地減少內存分配可能會變得更簡單。

+0

最初,當我創建了rawPoints列表時,我還將每個點添加到了轉換點列表中,因此它們總是具有相同的大小,並且在程序運行過程中沒有內存分配。據我所知,如果列表的大小從不改變,那麼數組和列表之間沒有性能差異。 – Klay 2009-10-10 16:26:36

+0

此外,這並沒有說明爲什麼這兩個應用程序執行得如此不同。 – Klay 2009-10-10 16:27:55