.NET Framework 如何:提高性能
以下編程做法可以節省內存和改善設備應用程序的性能。
使用 Windows 窗體和圖形節省內存
-
對提供 BeginUpdate 和 EndUpdate 方法的控件使用這兩種方法,提供這兩種方法的控件包括 ComboBox、ListBox、ListView、ToolStripComboBox 和 TreeView。
-
重新定位控件時,使用 SuspendLayout 和 ResumeLayout 方法。
-
在后臺加載其他窗體,使用數據來填充控件,然后再使用 Show 方法。
-
將事件處理代碼限制為僅執行重要任務,以便掛起過程可以繼續。
-
使用脫屏位圖。有關示例,請參見如何:繪制后臺圖像。
-
重寫控件上的 OnKeyDown、OnKeyPress 和 OnKeyUp 方法,而不是添加按鍵事件處理程序。
使用數據和字符串節省內存
-
在 for 循環中使用整數變量(Int32 或 Int64),而不使用對象變量。
-
避免使用枚舉的 ToString 方法,因為它會搜索元數據表,從而影響性能。
-
避免 OutOfMemoryException 錯誤。如果沒有足夠的內存分配給內部使用或分配給新對象實例,公共語言運行庫可能會引發此異常。要避免此異常,應避免編寫占用 64K 或更多內存的大方法。
-
移除 System.SR.dll,它包含異常對話框的錯誤信息字符串。部署應用程序時可以不使用此文件,從而節省內存。如果存在 System.SR.dll,則 .NET Compact Framework 將動態加載 System.SR.dll 中包含的錯誤字符串。
如果設備中不存在此 .dll 文件,則所有異常都包含消息“無法加載資源程序集”。不過,在開發期間將 System.SR.dll 引用添加到 Microsoft Visual Studio 2005 項目中總是有用的,因為這樣您將看到有意義的異常。
-
字符串是不可變的,因此,每次修改該字符串時都會創建新的 String 對象。構造需經常修改的字符串時,請考慮使用 StringBuilder。
-
如果您知道用于 DateTime 序列化的確切格式,請為 DateTime 使用 ParseExact 方法。否則,DateTime 分析器將按順序嘗試應用多個特定于區域性的格式。
-
限制打開 SqlCeCommand 對象的數量,并在完成后釋放它們。
與本機代碼進行交互時節省內存
-
在平臺調用操作中,使用可直接復制到本機結構中的類型,這樣的類型在托管和非托管內存中有一種通用表示形式,如 Int32 或 IntPtr。對于大于 32 位的可直接復制到本機結構中的值類型來說,通過引用傳遞比通過值傳遞更快。有關可直接復制到本機結構中的類型的更多信息,請參見 .NET Compact Framework 中可直接復制到本機結構中的類型。
-
為函數簽名中的參數使用 InAttribute 和 OutAttribute 屬性可以減少不必要的封送處理。
-
使用 Marshal 類中的方法手動在 IntPtr 和托管對象之間轉換,如 PtrToStructure、PtrToStringBSTR、GetObjectForNativeVariant 和 GetObjectForIUnknown。
-
使用 Prelink 和 PrelinkAll 方法來引發支持本機到托管調用的存根 (stub) 的 JIT 編譯。
-
如果期望您的本機 COM 對象通常情況下返回 S_FALSE,或其他非 S_OK HRESULT 值,則應將 PreserveSig 字段設置為 true,并使托管簽名與本機簽名匹配。這就避免了運行庫將 HRESULT 值轉換為 COM 調用上的異常時必需的 try/catch 塊的系統開銷。
-
盡量使用一個平臺調用多做工作,盡量少用多個調用。
在集合中節省內存
-
如果集合基于數組,請使用索引器。
-
一旦有機會,就指定集合的大小,因為動態調整大小可以大大增加額外的存儲。
-
使用泛型集合以避免值類型的裝箱和取消裝箱產生的系統開銷。定義您自己的優化集合可實現最佳性能。
在 XML 中節省內存
-
使用 XmlTextReader 和 XmlTextWriter 代替 XmlDocument(因為它占用的內存較多)。
-
指定 XmlReaderSettings 和 XmlWriterSettings 的設置以改善性能。如果 IgnoreWhitespace 和 IgnoreComments 兩個屬性值適用,它們可以顯著改善性能。
-
使用 UTF-8、ASCII 和 UTF-16 字符編碼,它們比 ANSI 和 Windows 代碼頁編碼更快。
-
避免使用用于分析的架構,因為這種架構需要更多的驗證工作。
-
當從 XML 源填充 DataSet 窗體時,應將列映射為屬性并使用類型化 DataSet。
-
填充 DataSet 時,應避免填充以下各項:
-
架構推理。
-
嵌套表。
-
多個 DateTime 列。為了獲得更好的性能,請使用 Ticks 屬性值。
-
-
使用 XML 反序列化時,遵循以下準則可改善性能:
-
使元素和屬性名盡量保持簡短,因為每個字符都必須經過驗證。
-
基于屬性數據的 XML 比基于元素數據的 XML 要快。
-
如果適用,使用 System.Xml.XmlNodeReader.Skip 方法。
-
如果性能很重要,應考慮二進制序列化。
-
-
為 XML 序列化的每一種類型分別使用一個 XmlSerializer 實例,以減少用于搜索元數據的時間。
-
由于序列化大量 XML 可能會耗盡內存,應考慮通過使用 BinaryReader 和 BinaryWriter 生成自定義二進制序列化機制。
使用 Web 服務時節省內存
-
讀取和編寫 DataSet 時,應使用 DiffGram。有關更多信息,請參見 DiffGram。
-
以 XML 格式將遠程 DataSet 及其架構保存到設備。
-
初始屏幕期間創建一個簡單的 Web 服務方法調用,因為第一個調用比后面的調用要慢。
-
小心處理網絡和數據錯誤。
-
某些情況下,可以手動將 DataSet 序列化為 XML 字符串,然后執行一個 Web 服務調用,這樣可以提高性能。
在高級編程中節省內存
-
異步處理大操作。
-
避免虛擬調用。.NET Compact Framework 運行庫虛擬調用比靜態調用或實例調用大約慢 30%。由于資源受約束,.NET Compact Framework 不使用 vtable,因此必須通過轉換類和接口層次結構來調用方法,但這是一種代價很高的操作。.NET Compact Framework 維護已解析的虛擬調用的緩存,因此在大多數情況下,無須重新解釋調用。
-
盡可能使用字段而不使用屬性。
-
定義值類型時,重寫 GetHashCode 和 Equals 方法。如果未重寫它們,則運行庫會在基 ValueType 類中使用這些方法的普通版本。
-
謹慎使用映射。出于調研目的將映射與非實例化類一起使用會影響應用程序中的實例化對象的性能。
-
確保 RESX 文件中的托管資源具有完全限定名,并且這些資源準確無誤。它們必須具有正確的版本和 PublicKeyToken 字段。為未正確指定的類型查找最合適的替代類型會影響性能。
-
請注意,在某些情況下,直接從文件讀取應用程序數據就足夠了,這比使用 ResourceManager 效率更高。ResourceManager 可以在定位您的二進制資源之前在文件系統中探測多個位置來查找最匹配的附屬程序集。為作業使用適當的工具。
?
?
?
摘http://msdn2.microsoft.com/zh-cn/library/1766918e(VS.80).aspx
轉載于:https://www.cnblogs.com/fosoyo/archive/2007/08/02/840518.html
總結
以上是生活随笔為你收集整理的.NET Framework 如何:提高性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSN和QQ文件传输速度解析
- 下一篇: 从客户端...中检测到有潜在危险的 Re