自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET內(nèi)存管理的最佳實(shí)踐

譯文
開發(fā) 后端
.NET應(yīng)用程序中常會處理服務(wù)器上大量的內(nèi)存,此時(shí)避免內(nèi)存浪費(fèi)是開發(fā)中需要注意的問題。本文詳細(xì)介紹了.NET內(nèi)存管理的最佳實(shí)踐,從代碼編寫到線程的使用,能夠顯著減少內(nèi)存的浪費(fèi)。

【51CTO精選譯文】我們在實(shí)際編程中使用的內(nèi)存往往都會超出程序需要的內(nèi)存,對于桌面應(yīng)用程序內(nèi)存是相對廉價(jià)的,但如果你在開發(fā)ASP.NET應(yīng)用程序,需要處理服務(wù)器上大量的內(nèi)存時(shí),過度使用內(nèi)存可能會帶來很多痛苦,因此有必要討論一下.NET內(nèi)存管理的***實(shí)踐,以減少內(nèi)存浪費(fèi)。

程序員在為類中的成員變量獲取內(nèi)存時(shí)往往有些多余的行為,因?yàn)橛行┎槐匾膬?nèi)存使用會浪費(fèi)掉一些內(nèi)存空間,我們來看一段代碼:

  1. public class BadUse  
  2. {  
  3.    private SqlConnection con = new SqlConnection();  
  4.    private DataSet ds = new DataSet("MyData");  
  5.    public BadUse() {}  
  6.    public BadUse(string connectionString)  
  7.    {  
  8.        SqlConnection = new SqlConnection(connectionString);  
  9.    }  
  10.    public BadUse(SqlConnection con)  
  11.    {  
  12.        this.con = con;  
  13.    }  

如果在我們的系統(tǒng)中使用了多余的內(nèi)存,類在被調(diào)用之前,甚至是構(gòu)造函數(shù)被調(diào)用之前,就調(diào)用了對象成員初始化程序,它將為所有成員變量獲取內(nèi)存,在上面的代碼中,在初始化期間我們創(chuàng)建了一個(gè)SqlConnection對象,在那之后,我們都調(diào)用默認(rèn)的構(gòu)造函數(shù)或創(chuàng)建對象的構(gòu)造函數(shù),因此沒有使用已經(jīng)創(chuàng)建好的對象,重新創(chuàng)建了一遍對象,因此浪費(fèi)了內(nèi)存空間。

.NET內(nèi)存管理***實(shí)踐方法:

  1. public class GoodUse  
  2. {  
  3.    private SqlConnection con = null;  
  4.    private DataSet ds = null;  
  5. public SqlConnection Connection // Better to use Properties  
  6. {  
  7.     get 
  8.     {  
  9.         if(this.con == null)   // Always check whether there is an existing object assigned to member  
  10.             this.con = new SqlConnection();  
  11.     return this.con;  
  12.     }  
  13.     set 
  14.     {  
  15.        if(value == null || this.con !=null)  
  16.         {  
  17.             this.con.dispose();     // Clears out Existing object if member is assigned to Null  
  18.             this.con = null;            //    Always better to assign null to member variables  
  19.        }  
  20.        if(value !=nullthis.con = value;  
  21.     }  
  22.   }  
  23.    public GoodUse() {}  
  24.    public GoodUse(string connectionString)  
  25.    {  
  26.          this.Connection = new SqlConnection(connectionString); //Assignes new object to null member  
  27.    }  
  28.  public GoodUse(SqlConnection con)  
  29.  {  
  30.        this.con = con;  
  31.   }  

從上面的代碼我們就更清晰了,使用屬性總比直接訪問對象要好,這里還給了你一個(gè)接口方便以后修改每個(gè)調(diào)用,與此類似,使用事件訪問程序訪問事件總是***的。

  1. private MyDelegate MyEvent;  
  2. public MyDelegate CheckEvent  
  3. {  
  4.     add  
  5.     {  
  6.        MyEvent + =value;  
  7.     }  
  8.     remove  
  9.     {  
  10.        MyEvent -= value;  
  11.     }  
  12. }  

在VB.NET中可以使用RaiseEvent,在代碼中無論何時(shí)觸發(fā)了事件都會調(diào)用它。

使用Using和Try/Catch程序塊

使用可隨意使用的對象時(shí)***使用Using程序塊,在.Net提供的所有構(gòu)造函數(shù)中,Try /Catch和Using程序塊經(jīng)常調(diào)用Dispose()函數(shù),只要對象實(shí)施了IDisposable,因此在.Net中使用Try /Catch和Using程序塊總是***的。來看下面的代碼:

  1. public void Execute(string connectionstring, string sql)  
  2. {  
  3.     SqlConnection con = new SqlConnection(connectionstring);  
  4.     SqlCommand cmd = new SqlCommand(sql, con);  
  5.     con.Open();  
  6.     cmd.ExecuteNonQuery();  
  7.     cmd.Dispose();  
  8.     con.Dispose();  
  9. }  

在上面的代碼片段中,我們簡單地創(chuàng)建了SqlConnection和SqlCommand對象,這兩個(gè)對象都實(shí)施了IDisposable,因此上面的代碼可以按照***實(shí)踐方法重寫如下:

  1. public void Execute(string connectionstring, string sql)  
  2. {  
  3.      using(SqlConnection con = new SqlConnection(connectionstring))  
  4.     {  
  5.          using(SqlCommand cmd = new SqlCommand(sql, con))  
  6.         {  
  7.             con.Open();  
  8.             cmd.ExecuteNonQuery();  
  9.           }  
  10.      }  
  11.  }  

這樣重寫之后將會自動調(diào)用Dispose函數(shù),我們不需要直接調(diào)用它,因此對于快速資源解除分配***使用Using程序塊。

也可以使用Try/ Catch程序塊,如:

  1. try 
  2. {  
  3.     SqlConnection con = new SqlConnection(connectionstring);  
  4.     try 
  5.     {  
  6.         SqlCommand cmd = new SqlCommand(sql, con);  
  7.         con.Open();  
  8.          cmd.ExecuteNonQuery();  
  9.     }  
  10.     catch {}  
  11.     finally 
  12.     {  
  13.         cmd.Dispose();  
  14.     }  
  15.     }  
  16.     catch(){}  
  17.     finally 
  18.     {  
  19.         con.Dispose();  
  20.     }  

接著是使用as或is比使用強(qiáng)制類型轉(zhuǎn)換要好,也就是說如果我們想轉(zhuǎn)換一個(gè)類型,應(yīng)該使用as關(guān)鍵字而不是使用明確的類型映射。

  1. object o = new SqlConnection();  
  2. SqlConnection con = o as SqlConnection; // Better to use this  
  3. SqlConnection con = CType(o, SqlConnection); // Not always better  

在上面的語句中,如果你使用第二個(gè)轉(zhuǎn)換語句,如果CType不能轉(zhuǎn)換成那個(gè)類型或在o中有空值,它將會拋出錯誤,但在使用了as的語句中不會拋出錯誤,而是使轉(zhuǎn)換無效。

調(diào)用函數(shù)時(shí)使用Structure

調(diào)用函數(shù)時(shí)參數(shù)少是一件好事,如果直接向函數(shù)發(fā)送一個(gè)大對象將會花大量的時(shí)間發(fā)送多個(gè)參數(shù),此時(shí)可以為那些要發(fā)送的參數(shù)創(chuàng)建一個(gè)Structure,然后直接發(fā)送這個(gè)Structure。

  1. public void Callme(int x, int y, string zy)    
  2. public void Callme(argumentStruct st) // Better in performance   

發(fā)送一個(gè)Structure總比發(fā)送離散對象要好。

使用一個(gè)大型組件總比使用大量的小型組件要好,大型組件中有許多命名空間,而不是大量的小型類庫,微軟也是這么干的,它將所有的組件都創(chuàng)建在mscorlib.dll中了,減少了元數(shù)據(jù)的負(fù)荷、JIT編譯時(shí)間和安全檢查等。

如果不是必須的***避免使用線程。

通常情況下,使用大量的線程可能導(dǎo)致性能下降,因?yàn)槊總€(gè)線程在獨(dú)立運(yùn)行時(shí)會消耗大量的內(nèi)存,當(dāng)你需要快速處理時(shí)可以使用線程,但它會增加內(nèi)存消耗。

當(dāng)你創(chuàng)建線程時(shí)使用ThreadPool(線程池)。

避免使用ArrayList和HashTables,當(dāng)你需要插入隨機(jī)數(shù)據(jù)時(shí)可以使用鏈接數(shù)組。

如果你看到ArrayList或HashTables的內(nèi)部結(jié)構(gòu),就知道它僅僅是數(shù)組的打包,無論何時(shí)向這些結(jié)構(gòu)中插入對象時(shí),它將為所有已分配量重新聲明,然后手動轉(zhuǎn)變它們,ArrayList是一個(gè)對象數(shù)組,HashTable是一個(gè)結(jié)構(gòu)數(shù)組。

另一個(gè)奇怪的事情是,ArrayList或HashTables的區(qū)間系數(shù)是4,這意味著它無論何時(shí)需要內(nèi)存時(shí)分配的內(nèi)存總是4的倍數(shù),當(dāng)你需要隨機(jī)插入時(shí),LinkLists、Generic Lists和LinkedArrays比Collections對象的性能要好,當(dāng)你需要添加數(shù)據(jù)和按順序顯示數(shù)據(jù)時(shí)使用Collections更好。

原文:Best Practices of Memory Usage

作者:Abhishek Sur

【編輯推薦】

  1. .NET 4.0內(nèi)存映射文件詳解
  2. .NET真的不用管內(nèi)存嗎?從List< T>列表聊起
  3. 淺析C#編程中的內(nèi)存管理
  4. .NET內(nèi)存中敏感數(shù)據(jù)的保護(hù)方案
  5. 淺析.NET框架下的自動內(nèi)存管理
責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2014-06-09 15:50:08

2013-06-09 10:38:54

IT運(yùn)維管理運(yùn)維管理ITIL管理

2022-07-07 08:00:00

VDI虛擬化虛擬桌面

2013-09-17 11:28:48

2010-09-27 11:07:35

2018-09-28 05:18:41

2025-02-17 01:00:00

.NET性能服務(wù)器

2015-11-19 09:26:01

ASP.NET跨平臺實(shí)踐

2010-09-28 17:38:56

日志管理

2020-06-12 07:00:00

Web開發(fā)項(xiàng)目

2013-05-17 11:43:55

主數(shù)據(jù)數(shù)據(jù)管理

2018-12-04 09:00:00

API安全性令牌

2010-08-11 15:09:15

2017-11-01 14:45:51

數(shù)據(jù)管理數(shù)據(jù)

2025-04-11 03:00:55

2023-09-12 06:55:27

2025-03-18 00:10:00

2014-07-29 09:25:39

加密密鑰管理云加密

2011-08-30 11:19:25

遠(yuǎn)程服務(wù)器數(shù)據(jù)中心遷移服務(wù)器管理工具

2011-07-22 09:50:34

云服務(wù)云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號