對c 拆裝箱的效能分析(泛型)

2022-03-29 08:21:11 字數 1339 閱讀 1709

c#中,資料型別主要分為2種,分別為值型別和引用型別。把值型別轉換為引用型別稱為裝箱,把引用型別轉換為值型別稱為拆箱。在c#中,值型別是在堆疊上分配記憶體的,而引用型別是在堆上分配記憶體的。裝箱的時候,clr會為堆上的物件建立乙個臨時的引用型別「box」。

該轉換是隱式進行的,如上面的例子所述。還可以手工進行轉換:

int i = 1;

object o = i;

而拆箱是顯示的,

int i = 20; 

bject o = i;

int j = (int)o;   

在c#2.0之前的版本中,考慮如下問題,arraylist集合的add方法接受的是bject型別,如果此時進入的是值型別,那麼就會進行裝箱操作,如果從集合中取出資料,則還會進行相應的拆箱操作,現在觀察,如果在乙個大的迴圈結構中,進行這種操作,毋庸置疑的,會對效能造成影響,因為拆裝箱本身就是要損失效能的。下面就分別使用泛型和不使用的情況進行**分析。事例很簡單,真實地業務環境會比這個複雜很多,再次僅僅表現出效能即可。

例子中宣告乙個arraylist集合,首先是將1千萬個數字新增到集合中,然後再取出來,分別進行了裝箱和拆箱操作,

datetime tbegin = datetime.now;

arraylist list = new arraylist();

for (int i = 1; i <= 10000000; i++)

...for (int j = 0; j < list.count; j++)

...datetime tend = datetime.now;

timespan ts = tbegin - tend;

console.writeline(ts.tostring());

經過多次執行,取平均值,大約為3.9秒,下面的**適用泛型技術,應用了system.collections.generic命名空間下的泛型集合list<>,**如下:

datetime tbegin = datetime.now;

listlist = new list();

// arraylist list = new arraylist();

for (int i = 1; i <= 10000000; i++)

...for (int j = 0; j < list.count; j++)

...datetime tend = datetime.now;

timespan ts = tbegin - tend;

console.writeline(ts.tostring());

經過多次執行得到乙個平均值約為0.583,

可以輕鬆看出,應用泛型和沒有應用泛型時間差了近6.7倍。

C 裝箱 拆箱 泛型

1 裝箱 值型別轉引用型別。開闢一塊記憶體空間進行存放資料。2 拆箱 引用型別轉值型別。值型別存放在棧上,引用型別存放在堆上。裝箱需要消耗記憶體,所以引出了泛型。泛型 1.使用非泛型集合時引發的裝箱和拆箱操作 看下面的一段 1 2 3 4 5 6 7 8 vararray newarraylist ...

C 程式分析 泛型

using system using system.collections.generic using system.text using system.collections namespace test public int count public class prime class prog...

C 委託 泛型 事件 裝箱拆箱

一 委託 我感覺的委託就是指乙個函式指標,指向被委託的方法,在定義的時候把返回值型別與引數全部定義好,建立的例項相當於乙個指向被委託函式的指標,然後將需要的資料通過委託傳進去 是先呼叫委託例項,然後委託例項再呼叫方法 簡寫的那種方式更能體現它像乙個函式指標 注意 多播委託就是用 與 進行操作 當多播...