日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

精簡高效的C#網站優化經驗技巧總結_C#教程

作者:張飛洪 ? 更新時間: 2022-06-27 編程語言

對大型網站,技術涉及面非常廣,對硬件,軟件,編程語言,Web Service,防火墻等等有很高要求。

面對大量用戶,高并發請求,可以使用高性能服務器,高性能編程語言,高性能數據庫,加大帶寬等,這意味著巨大的投入。

如果你沒有這樣的打算,而又想獲得更好的系統性能,則需要我們精打細算,從"軟"的方面著手。

如果你有過以下的一些用法,或者有不同見解,請賜教。

(1)Foreach比for有更好的執行效率。

Foreach所花的時間大約只有for的30%,通過測試結果,在兩者都可以使用的情況下,我們推薦效率更高的Foreach。另外用for寫入數據的時間大約是讀取數據時間的10倍。

(2)避免使用ArrayList

因為任何對象存放到里面,都要轉化為System.Object類型,從ArrayList中取出數據要拆箱回原來的類型。建議使用.NET2.0的泛型,這是一個強類型,可以避免裝箱拆箱的性能消耗。

(3)不要使用UpperCase,LowerCase轉換字符串,再進行比較。用String.Compare代替,他可以忽略大小寫進行比較。

(4)用StringBuilder代替字符串連接符"+"

原因,見我的另一篇文章String 和BulidString性能比較和內在機制

(5)避免在循環內聲明變量,應該在循環外聲明變量,在循環里初始化

//避免
 for(int i=0;i<10;i++)
{
AnyClass cl=new AnyClass();
//……
}
//推薦
for(int i=0;i<10;i++)
{
cl=new AnyClass();
//……

(6)捕獲異常,不用使用System.Exception

//避免
 try
 {
 //TODO
 }
 catch (Exception ex)
 {
 //TODO(雖然簡單,但性能較差)
 }
  //推薦
  try
  {
  //TODO
  }
  catch (System.NullReferenceException ex)
  {
  //對空對象異常處理
  }
  catch (System.ArgumentOutOfRangeException ex)
  {
  //超出范圍異常處理
  }
  catch (System.InvalidCastException ex)
  {
  //對異常轉化的處理
  }

(7)不要使用異常控制程序流程。

異常捕獲對性能的消耗很大,眾所周知的,能避免使用最好不用

     //避免
try
{
result=200/num;
}
catch (Exception ex)
{
result=0
 }
 //推薦
 try
 {
 result=num!=0?200/num:0;
 }
 catch (Exception ex)
 {
 result=0
 }

(8)在遇到調用實現IDisposable對象的時候,用Using和try/finally來釋放資源

//避免
 public void ExceuteCommand()
             {
                 SqlConnection sql=new SqlConnection(strCon);
                 SqlCommand cmd=new SqlCommand(sql);
                 sql.Dispose();//上面出錯,此處有可能永遠都調用不到
                 cmd.Dispose();
             }
  //建議
 //Using內并不是可以放任何對象,只有實現了IDisposable接口的對象才能被使用。
 //編譯器成IL時候,Using會自動把內容放在try/finally里面。           
  try
             {       
                 using(SqlConnection sql=new SqlConnection(strCon))    
                 {
                      using(SqlCommand cmd=new SqlCommand(sql))
                     {
                     //TODO
                     }
                 }
             }
             catch (Exception ex)
             {
                 //
             }
             finally{
                 //或者
                 //sql.Dispose();
                 //cmd.Dispose();
             }
 //推薦
 因為如果遇到多個實現IDisposable接口的對象需要釋放,try/finally更好些
  //推薦
             SqlConnection sql=null;
             SqlCommand cmd=null;
             try
             {       
                 sql=new SqlConnection(strCon);
                 cmd=new SqlCommand(sql);
                 sql.Open();
                 cmd.ExecuteNonQuery();
             }
             finally{
                 if(sql!=null)
                   sql.Dispose();
                 if(cmd!=null)
                   cmd.Dispose();
             }

(9)避免使用反射,反射是比較浪費性能的操作

通過反射來調用類型或方法,字段或屬性是CLR要做更多的工作,如校驗參數,檢查權限,所以速度是非常慢的。對于打算寫一個動態構造類型(晚綁定)的應用程序,可以通過繼承,接口,委托來實現。

(10)值類型組合成字符串,請使用.ToStrng()方法,避免裝箱操作。

//避免
var str="hello"+1+2;
//推薦
var str="hello"+1.ToString()+2.ToString();

(11)StopWatch類測試運行時間

public delegate void AddHandler();
     class Program
     {
         static void Main(string[] args)
         {
             Utility.ProcessTimeSpan(Program.Add);
             Console.Read();
         }
         public static void Add()
         {
             var a = 0;
             for (int i = 0; i < 100000000; i++)
             {
                 a++;
             }
         }
     }
  public static class Utility
     {
         public static void ProcessTimeSpan(AddHandler addDelegate)
         {
   //推薦
             DateTime start = DateTime.Now;
             var timer = Stopwatch.StartNew();
             addDelegate();
             timer.Stop();
             Console.WriteLine("Method took {0} ms", timer.ElapsedMilliseconds);
  //傳統
 DateTime start = DateTime.Now;
 SomeCodeToTime();
 DateTime end = DateTime.Now;
 Console.WriteLine("Method took {0} ms", (end - start).TotalMilliseconds);
         }
     } 

原文鏈接:https://www.cnblogs.com/jackyfei/archive/2011/03/13/optimize.html

欄目分類
最近更新