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