對大型網站,技術涉及面很是廣,對硬件,軟件,編程語言,Web Service,防火牆等等有很高要求。html
面對大量用戶,高併發請求,可使用高性能服務器,高性能編程語言,高性能數據庫,加大帶寬等,這意味着巨大的投入。sql
若是你沒有這樣的打算,而又想得到更好的系統性能,則須要咱們精打細算,從"軟"的方面着手。數據庫
若是你有過如下的一些用法,或者有不一樣看法,請賜教。編程
(1)Foreach比for有更好的執行效率。服務器
Foreach所花的時間大約只有for的30%,經過測試結果,在二者均可以使用的狀況下,咱們推薦效率更高的Foreach。另外用for寫入數據的時間大約是讀取數據時間的10倍。併發
(2)避免使用ArrayList編程語言
由於任何對象存放到裏面,都要轉化爲System.Object類型,從ArrayList中取出數據要拆箱回原來的類型。建議使用.NET2.0的泛型,這是一個強類型,能夠避免裝箱拆箱的性能消耗。ide
(3)不要使用UpperCase,LowerCase轉換字符串,再進行比較。用String.Compare代替,他能夠忽略大小寫進行比較。高併發
(4)用StringBuilder代替字符串鏈接符"+"性能
緣由,見個人另外一篇文章String 和BulidString性能比較和內在機制
(5)避免在循環內聲明變量,應該在循環外聲明變量,在循環裏初始化
1 //避免
2
3 for(int i=0;i<10;i++)
4
5 {
6
7 AnyClass cl=new AnyClass();
8
9 //……
10
11 }
12
13 //推薦
14 for(int i=0;i<10;i++)
15
16 {
17
18 cl=new AnyClass();
19
20 //……
21
22 }
(6)捕獲異常,不用使用System.Exception
1 //避免
2 try
3 {
4 //TODO
5 }
6 catch (Exception ex)
7 {
8 //TODO(雖然簡單,但性能較差)
9 }
10
11 //推薦
12 try
13 {
14 //TODO
15 }
16 catch (System.NullReferenceException ex)
17 {
18 //對空對象異常處理
19 }
20 catch (System.ArgumentOutOfRangeException ex)
21 {
22 //超出範圍異常處理
23 }
24 catch (System.InvalidCastException ex)
25 {
26 //對異常轉化的處理
27 }
(7)不要使用異常控制程序流程。
異常捕獲對性能的消耗很大,衆所周知的,能避免使用最好不用
1 //避免
2
3 try
4 {
5 result=200/num;
6 }
7 catch (Exception ex)
8 {
9 result=0
10 }
11
12 //推薦
13 try
14 {
15 result=num!=0?200/num:0;
16 }
17 catch (Exception ex)
18 {
19 result=0
20 }
(8)在遇到調用實現IDisposable對象的時候,用Using和try/finally來釋放資源
1 //避免
2
3 public void ExceuteCommand()
4 {
5 SqlConnection sql=new SqlConnection(strCon);
6 SqlCommand cmd=new SqlCommand(sql);
7 sql.Dispose();//上面出錯,此處有可能永遠都調用不到
8 cmd.Dispose();
9 }
10
11 //建議
12
13 //Using內並非能夠聽任何對象,只有實現了IDisposable接口的對象才能被使用。
14 //編譯器成IL時候,Using會自動把內容放在try/finally裏面。
15
16 try
17 {
18 using(SqlConnection sql=new SqlConnection(strCon))
19 {
20 using(SqlCommand cmd=new SqlCommand(sql))
21 {
22 //TODO
23 }
24 }
25 }
26 catch (Exception ex)
27 {
28 //
29 }
30 finally{
31 //或者
32 //sql.Dispose();
33 //cmd.Dispose();
34 }
35
36 //推薦
37
38 由於若是遇到多個實現IDisposable接口的對象須要釋放,try/finally更好些
39
40 //推薦
41 SqlConnection sql=null;
42 SqlCommand cmd=null;
43
44 try
45 {
46 sql=new SqlConnection(strCon);
47 cmd=new SqlCommand(sql);
48 sql.Open();
49 cmd.ExecuteNonQuery();
50
51 }
52 finally{
53 if(sql!=null)
54 sql.Dispose();
55 if(cmd!=null)
56 cmd.Dispose();
57 }
(9)避免使用反射,反射是比較浪費性能的操做
經過反射來調用類型或方法,字段或屬性是CLR要作更多的工做,如校驗參數,檢查權限,因此速度是很是慢的。對於打算寫一個動態構造類型(晚綁定)的應用程序,能夠經過繼承,接口,委託來實現。
(10)值類型組合成字符串,請使用.ToStrng()方法,避免裝箱操做。
1 //避免
2
3 var str="hello"+1+2;
4
5 //推薦
6
7 var str="hello"+1.ToString()+2.ToString();
(11)StopWatch類測試運行時間