昨天發了一篇如何最大限度提高.NET性能的文章,評論的人不少,在這裡非常感謝大家的評論,其中有些是指出文章的一些錯誤的,在這裡感謝那些耐心寫評論的老大們,小弟受益不少。
昨天那篇主要是從寫程式碼的一些細節上來提高速度,可能很些是難實際感受到效能的提高,但是身為程式設計師,不斷提高自己程式碼的品質是不斷追求的目標。
其實隨著硬體的發展,現在硬體的速度已經遠遠滿足大多數人的需要了,甚至有些人提出演算法在現在軟體開發中越來越不起作用了。記得以前看過麻省的資料結構視頻,講課的教授就問過一個問題(我記得不大清楚了,他的大概意思就是這樣):既然算法現在變得不重要了,為什麼我們還要在這裡研究呢?他給的答案就是「SPEED」 ,我們追求速度就像賽車手追求速度一樣!
現在很多系統的開發都不會把速度放在第一位,其他如:穩定性,安全性,可重用性等往往最優先考慮的。現在設計模式,開發架構等主要都不是為了解決效能問題的。以上這些都是分析師,架構師考慮的,像我們一些小小的程式設計師就只能在程式碼的一些小地方,一個類,一個方法,一行程式碼上面來優化程式。我覺得多注意一些細節上的東西還是很好的。
好了廢話說了一大堆,現在來說說今天的主題,現在開發的很多網絡系統性能開銷主要是在數據的讀取,傳輸上,更快的讀取速度,更少的網絡寬頻佔用是我們追求的目標。我就從這方面來談談如何提升.net的效能。
1. 在資料圖層分頁資料。可以透過ExcuteReader或預存程序實現,方法很多,我就不多說了.(可以看看我寫的 )
2. 盡量使用ExcuteReader來讀取數據,ExcuteReader是效率最高的,在MicroSoft的PetShop 4.0全部數據訪問都是用ExcuteReader來實現的,除非你對非連線有特殊需求(如SmartClient智慧型客戶端等)。
3. 在非連接場合,用DataTable比用DataSet效能好,除非你要儲存多個關係表。
4. 使用DataTable的ImportRow方法。
有些場合需要把大量資料從一個DataTable複製到另一個DataTable,使用DataTable的ImportRow方法可以大大提高效能,資料量少時沒多大分別,當資料量到一萬行以上時就可以明顯的提高,可以達到幾倍。
5. 把資料序列化為二進位檔案方便傳輸。
我們在處理DataSet,DataTable物件時可以序列化為XML文件,如果要在網路傳輸,XML文件會產生內存,網路頻寬等資源問題。這時我們就可以把它序列化為二進位文件,這樣產生的文件會減少很多,程式碼如下:
FileStream fs = new fileStream(@"XMLData.bin",FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs,XMLData);
fs.colse();
這樣產生的二進位檔案稱為XMLBinary,用WINHEX直接開啟還可以看到一些XML標記在裡面,如果資料量很大,這時加一行程式碼:
XMLData.RemortingFormat = SerializationFormat.Binary;
這時產生的文件稱為TrueBinary文件,當處理大量(超過10000行)時產生的文件尺寸是XMLBinary的幾分之一。序列化的時候會自動儲存模式,這樣解序過程很簡單。我還不知道解序比直接讀取XML效能會下降多少。
6. 合理利用連線池。
連接池對效能的提高有很大的作用,預設是開啟的。預設的Min Pool Size是0,一般設為一個比較小的值,如5。 Max Pool Size預設是100,大多數WEB站點也夠用,大型的適當增大。
7. 使用SQLCLR開發
如果你是專注開SQL Server系列那你應該去研究一下SQLCLR,它的功能非常強大,在很多場合都可以提升效能(特別是大型企業級應用程式)。
8. 透過靜態類別來存取APP.Config/Web.Config
我們有很多配置資訊都是放在APP.Config/Web.Config,訪問都會很頻繁,這時建立一個靜態類,所有的屬性都透過靜態類來訪問,可以在一定程度提高性能,靜態類只實例化一次,而APP.Config/Web.Config會產生很多IO操作。
public static class MyWebConfig
{
static MyWebConfig()
{
ConnString =
ConfigurationManager.ConnectionStrings["Connection"].
ConnectionString;
}
public static string DbConnectionString
{
get
{
return ConnString;
}
}
}
好了今天就寫到這裡, 有什麼錯誤和不足的地方希望指出,歡迎提出更好的意見,共同進步。