對於如何提高應用程式的效能(無論是互連網應用還是企業級應用)我的觀點一直是考慮一個核心:IO處理。因為我認為目前的CPU的處理能力已經是非常高了,正常編寫的在記憶體中處理的代碼沒有太嚴重的問題都不會對CPU造成很大的影響,效能往往是被IO所限制。由於我和我的團隊溝通時間比較長,所以我們之間的一個簡單的IO說明往往覆蓋了很多的含義,這些IO包括了磁碟IO、網路IO、記憶體IO以及各種裝置的IO處理。我們的團隊經驗是儘可能的在各種IO處理中尋找出可以提升的效率。
以下,我將從後向前說明我們團隊在提升IO處理的經驗和認識
1 資料庫
資料庫是最明顯的消耗磁碟IO的組件,提高資料的效能有多種,SQL語句寫的好,也是減少了表的掃描(明顯是IO動作),設計合理的索引又是提高了IO處理能力,將不在變化的曆史資料獨立的儲存也減少了複雜IO的處理,為表設計冗餘的欄位也是為了減少IO讀寫提高效能,將資料表分布在不同的磁碟上也是提升IO效率。還有其他的各種方式,比如查詢快取、串連池神馬的,原則同樣如此。
總之,減少資料庫和磁碟之間過度的活動,能儘可能的提升資料庫效率。
2 資料緩衝
記憶體IO的處理效能自然要遠高於磁碟IO,資料的緩衝就是減少磁碟操作,或至少減少效能更低的資料庫操作。對於頁面的結果資料緩衝我們的通常簡單方案是準備兩個緩衝區:一個記憶體,一個檔案
記憶體的緩衝區,我們直接用HttpRuntime.Cache,在這個緩衝區中我們放置特徵碼和資料(資料往往是頁面需要的資料,一般我們放置JSON格式),到期策略上我們自然選擇NoAbsoluteExpiration。
當資料需要從記憶體緩衝區中被撤掉時,我們會將這個到期資料再次處理,我們在Cache中有一個集合,這個集合放置了被撤掉的快取資料的特徵碼,而對應的資料寫入磁碟上的一個檔案中。
使用者請求資料時,先檢查特徵碼是否在正常的緩衝中,如果不在,則檢查是否在到期區,如果是到期區,則去讀取磁碟檔案(至少減少了資料庫開銷),都沒有,那去查資料庫吧。
3 對集合的代碼處理
無論是頁面的javaScript,還是背景java,C#,在目前的業務中對集合/數組的操作肯定是最頻繁的,考慮用一些細節上的最佳化,也可以提高效能
[csharp] view plaincopyprint?
- int[] arr = { 1, 3, 6, 7, 3, 6, 7, 3, 5 };
-
- for (int i = 0, max = arr.Length; i < max; i++)
- {
- System.Console.WriteLine(arr[i]);
- }
int[] arr = { 1, 3, 6, 7, 3, 6, 7, 3, 5 };</p><p>for (int i = 0, max = arr.Length; i < max; i++)<br />{<br /> System.Console.WriteLine(arr[i]);<br />}
類似很多技巧都是減少對集合Length/Count的反覆確認對高頻的集合操作是有益的。當然集合中不能動態加減資料。數組優先、泛型其次,arrayList最後考慮,這些選取的原因都是減少IO開銷。
還有很多代碼的細節都是可以提高效率,比如對string的認知什麼的。
(林永堅MVP 提示我沒有表達清楚以上意思,我的想法是:集合我的測試是,如果反覆的判斷count會比較慢,不如for的時候吧count先求出來,還有就是儘可能的用數組,因為數組初始化的時候已經賦值完畢了,且又是強型別,不知道我表達的對不)
4 網路傳輸
後台資料最終要傳遞給瀏覽器,減少網路傳輸的位元組也是提高吞吐的重點,簡單的說,就是對網路IO處理最佳化。減少webform中的ViewState資訊,或者乾脆不用webform,改用MVC,或者直接httpcontext自己來控制所有狀態資訊。我們採用ashx並且為不同的服務開闢不同的ashx通道提高效能。由於ashx不必做一系列動作、不用經過一連串的事件處理、一大堆的控制項狀態管理(載入並解析ViewState,還原、更新控制項的值、儲存ViewState等),直接返回操作結果,也就不用耗費更多的伺服器資源,返回的格式也非常好靈活,所有用ashx在基於文檔型的網站中我們運用的很好。
另外一點ashx對開發成員的工作隔離也是非常好。
除了編程影響傳輸,頁面需要的圖片和css檔案,js檔案合理的處理減少HTTP請求也能提高網路IO效率:比如將圖片合并,js、css壓縮等簡單的方式雖然改變不多,但並發的時候降低伺服器的壓力總是好的。
5 頁面渲染和體驗
最佳化頁面的html結構,有時候為了加快渲染,不必完全符合W3C的規範,減少div嵌套,使用固定寬度,主要javaScript的細節可以提高很好的體驗。我在chrome中的測試結果可以發現,很多情況下網路的速度遠遠高於渲染的速度,所以能提高頁面的處理,對個體使用者的體驗是很有效。
4 資料提交
在可靠的情況下,多考慮非同步模式或多線程。對資料庫的提交,web服務的訪問都可以使用非同步模型,當然是在可靠的情況下。
頁面的ajax自然也是非同步一種方式,另外js檔案的載入也可以非同步方式。
5 鎖太累了,先不寫了 林永堅MVP還提出了用noSQL,恩,是的,不過我還沒有好好用呢,不能講出什麼來
本文轉至:http://blog.csdn.net/shyleoking/article/details/7277898