網站優化的經驗和技巧--精簡高效的C#

對大型網站,技術涉及面很是廣,對硬件,軟件,編程語言,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類測試運行時間

 
View Code
1 public delegate void AddHandler(); 2 class Program 3 { 4 static void Main(string[] args) 5 { 6 Utility.ProcessTimeSpan(Program.Add); 7 Console.Read(); 8 } 9 10 public static void Add() 11 { 12 var a = 0; 13 for (int i = 0; i < 100000000; i++) 14 { 15 a++; 16 } 17 } 18 }   19 20   public static class Utility 21 { 22 public static void ProcessTimeSpan(AddHandler addDelegate) 23 { 24      //推薦 25 DateTime start = DateTime.Now; 26 var timer = Stopwatch.StartNew(); 27 addDelegate(); 28 timer.Stop(); 29 Console.WriteLine("Method took {0} ms", timer.ElapsedMilliseconds); 30 31      //傳統 32 33     DateTime start = DateTime.Now; 34     SomeCodeToTime(); 35     DateTime end = DateTime.Now; 36     Console.WriteLine("Method took {0} ms", (end - start).TotalMilliseconds); 37 38 39 40 } 41 }
相關文章
相關標籤/搜索