2010-04-09 143 views
2

在客戶端遇到一些性能問題後,我們決定嘗試一些性能分析器來嘗試找出瓶頸或識別代碼的有罪部分。 當然,儘可能多的表現調查,問題來自各種各樣的事情,但我發現我的用戶控件的ComponentResourceManager.ApplyResources花費了太多的時間在我的表格的構建:超過24%的施工時間是花費在InitializeComponent()以內的ApplyResources。 這似乎相當多隻是「找到一個資源字符串,並將其放入它的容器」。增強本地化性能? (ComponentResourceManager.ApplyResources)

ComponentResourceManager.ApplyResources究竟做了什麼?我猜想不僅僅是搜索字符串,如果不是這樣也不會花那麼長時間。

有沒有一種方法來提高本地化的表現?我們的軟件本地化爲多種語言,所以我們確實需要保持這種多語言功能。

有關此問題的任何建議?

謝謝! PS:我們用C#,.NET 3.5 SP1編碼。

+0

我發現我正在通過所有打開的窗口循環並應用語言更改來教授窗體。但是其中一些形式被處置了(並且在關閉它們之後掛了很長一段時間)。跳過處置的表格後,速度顯着增加。 – TamusJRoyce 2011-12-20 13:59:25

回答

2

的ApplyResources方法使用反射來找到將與資源值被更新的屬性:

property = value.GetType().GetProperty(name, bindingAttr);

反射是相當慢。手動將資源值分配給屬性(例如,使用ResourceManager.GetString(...))。編碼很繁瑣,但應該提高性能。

+0

這絕對會讓事情變得更快,但翻譯的代碼非常繁瑣(對我來說,很難相信提供的本地化框架是如此糟糕的表現明智的... ... – srodriguez 2011-03-29 07:39:04

1

我會抓住反射器,並看看ApplyResources方法,看看它實際上做了什麼。

我還建議使用JetBrains dotTrace 4(目前在EAP中,但可以下載試用版)進行分析,因爲它也可以顯示在系統類中花費的時間。這使得它在實際花費時間的情況下更加透明。例如,您可以查看是否花時間在字典中查找密鑰,訪問文件等。

您也可以做一個微型基準測試並測量在Y軸上查找X鍵所用的時間,大小的字符串字典,其中X是特定表單上本地化資源的數量,Y是總資源池。它至少會讓你明白,如果你要將它們緩存在字典中,你可以多快查找資源,這可能會幫助你決定是否值得編寫自己的資源提供者。

+0

那麼,看着反射器並沒有真正的幫助:基本上它創建了一個散列表並尋找關鍵。一旦發現它創建一個屬性並在裏面賦值。沒有什麼可能需要那麼長時間。 我們使用了ANTS性能分析器,基本上是「ApplyRessources」trigers項目大小的變化(猜測使文本等正確填充控件)。 我認爲將資源池包裝在資源管理器中可能會有所幫助,但它不會更新組件,這實際上是由ApplyResources在後臺完成的。感覺很奇怪,它很慢... – srodriguez 2010-04-09 06:06:11