2014-02-06 96 views
0

我有WPF應用程序。有幾個窗口(每個都在自己的線程中)5-10個窗口。每個只有一個重要的控制(這是數據網格)。每個數據網格有2000-3000行和5列。綁定到項目的每行數據以及項目屬性更改UI時會發生很多變化(90%的更改是 - 文本,前景,背景)。所有窗口每秒鐘都有1000次更改。WPF虛擬化的性能開銷

如果我將病毒轉換爲回收,應用程序消耗的內存減少35-40%。

但是我猜測如果容器沒有回收代碼必須跑得更快(因爲.NET不會需要重新綁定容器並重新評估dep道具並且可能更多)。

有沒有人試圖深入調查這一點?

是否有性能損失/優勢使用容器回收(無論多小是我需要知道的)。

編輯:獲取更新的項目是95%是可見的(換句話說,如果一行不可見,有99%的機會不會被更新)。網格行內容/數量也不會改變。只有文本和顏色在單元格中發生變化。行總是保持不變。

+1

'感謝您添加信息,而不是告訴我,我不需要這個' - **過早優化是所有邪惡的根源**。我並不是說你不需要這個。我只是說,如果你的應用程序運行良好,沒有性能問題,那麼沒有什麼可以優化 –

+0

非常抱歉在這裏..但我沒有要求幫助我優化我的應用程序..我永遠不會..我知道如何忙着你都是..我只是問,所以我知道..再次感謝 –

回答

2

由於更好的內存緩存利用率和更少的垃圾回收,您使用1/3內存的事實可能會導致其本身的性能提升。

此外,如果具有超過2000行的數據網格未被虛擬化,則需要將這些行中的任何一個的更新傳播到該視圖。如果它是虛擬化的,則只有在屏幕上(以及某些緩衝區行)可見的行需要在更改時更新。

填充2000行需要時間。虛擬化時,數據到達時只需填充少數行,其他行在滾動時填充。如果沒有虛擬化,滾動時需要完成的工作量較少,但初始化時需要完成更多的工作。

但真正的問題是:滾動時可見的額外工作嗎?滾動時,每秒可以獲得多少幀?你看到UI更新緩慢嗎?如果沒有,虛擬化。

這是內存使用率和CPU使用率之間的典型折衷,一方面是快速初始化和較慢的滾動,另一方面是較慢的初始化和較快的滾動。

比較和衡量,看看什麼最適合你。

+0

如果我能我會的。沒有任何折衷,因爲我有足夠的內存,但只有8個CPU核心。獲取更新的項目有95%是可見的,因此關於可見區域外部網格更新的參數在我的情況下是無效的。網格行內容/數量也不會改變。只有文本和顏色在單元格中發生變化。行總是保持不變 –

+0

P.S.也沒有太多的垃圾收集正在進行..該應用程序是非常靜態的內存... –

+0

我同意克里斯。 dp重新評估只是等式的一個方面。標準模式會給GC帶來更多壓力,並導致超時堆碎片。 –