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

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++)
??????????? ...{
??????????????? //System.Threading.Thread.Sleep(1);


??????????????? list.Add(i);
??????????? }
??????????? for (int j = 0; j < list.Count; j++)
??????????? ...{
??????????????? int s = (int)list[j];
??????????? }
??????????? DateTime tend = DateTime.Now;
??????????? TimeSpan ts = tbegin - tend;
??????????? Console.WriteLine(ts.ToString());

經過多次運行,取平均值,大約為3.9秒,下面的代碼適用泛型技術,應用了System.Collections.Generic命名空間下的泛型集合List<>,代碼如下:

DateTime tbegin = DateTime.Now;
??????????? List<int> list = new List<int>();
??????????? // ArrayList list = new ArrayList();
??????????? for (int i = 1; i <= 10000000; i++)
??????????? ...{
??????????????? //System.Threading.Thread.Sleep(1);


??????????????? list.Add(i);
??????????? }
??????????? for (int j = 0; j < list.Count; j++)
??????????? ...{
??????????????? int s = (int)list[j];
??????????? }
??????????? DateTime tend = DateTime.Now;
??????????? TimeSpan ts = tbegin - tend;
??????????? Console.WriteLine(ts.ToString());
經過多次運行得到一個平均值約為0.583,

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


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/chenyuling/articles/1609660.aspx

?

轉載于:https://www.cnblogs.com/ly312/archive/2009/06/25/1511164.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379639.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UNIX環境高級編程---進程間通信總結

進程間通信1 管道匿名管道命名管道2 消息隊列3 信號量POSIX信號量有名信號量無名信號量有名信號量和無名信號量的公共操作4 共享內存5 信號相關函數6 套接字針對 TCP 協議通信的 socket 編程模型針對 UDP 協議通信的 socket 編程模型針對本地進程間通信的 socket 編程模型總結L…

C語言一個小小的問題引起的對指針的探究。。。

C語言一個小小的問題引起的對指針的探究。。。 廢話不多說。下面是這個大家認識的一個及其簡單的程序&#xff1a; 1 #include <stdio.h>2 void A(int a[])3 {4 printf("%d/t", sizeof(a));5 }6 int main()7 {8 int a[512];9 int *p; 10 …

java 方法 示例_Java集合syncedSet()方法與示例

java 方法 示例集合類syncedSet()方法 (Collections Class synchronizedSet() method) synchronizedSet() method is available in java.util package. 可以在java.util包中使用syncedSet ()方法 。 synchronizedSet() method is used to return the synchronized view of the …

IE的全屏幕顯示(javascript)

<SCRIPT LANGUAGE"javascript"> <!-- if (this.name!fullscreen){ window.open(location.href,fullscreen,fullscreen,scrollbars) } // --> </script> 轉載于:https://www.cnblogs.com/bangchao/archive/2009/06/26/1511645.html

搜索---廣度優先遍歷、深度優先遍歷、回溯法

參考文章&#xff1a;https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%90%9C%E7%B4%A2.md 廣度優先搜索&#xff08;BFS&#xff09; 廣度優先搜索是按層來處理頂點的&#xff0c;距離開始點最近的那些頂點首先被訪問&#…

如何更改Visual Studio 2008中類文件引用的默認名稱空間?

在編寫程序的時候&#xff0c;如果某些名稱空間經常用到&#xff0c;每次創建一個文件的時候&#xff0c;都需要手工添加名稱空間&#xff0c;是不是很煩人呢&#xff1f;多說人會回答&#xff1a;是的。如果新建文件的時候就自動加上自己需要的名稱空間該多好啊。&#xff1a;…

Java ClassLoader findLoadedClass()方法與示例

ClassLoader類findLoadedClass()方法 (ClassLoader Class findLoadedClass() method) findLoadedClass() method is available in java.lang package. findLoadedClass()方法在java.lang包中可用。 findLoadedClass() method is used to return the Class with the given binar…

Linux內核設計與實現---內存管理

內存管理1 頁2 區3 獲得頁獲得填充為0的頁釋放頁4 kmalloc()gfp_mask標志kfree()5 vmalloc()6 slab層slab層的設計7 slab分配器的接口8 在棧上的靜態分配9 高端內核的映射永久映射臨時映射10 每個CPU的分配11 新的每個CPU的接口編譯時的每個CPU數據運行時每個CPU數據12 使用每個…

多語言開發 之 通過基頁類及Session 動態響應用戶對語言的選擇

在用戶通過UserLogin.aspx登錄系統時 提供其對語言的選擇選擇后 將所選存入Session 以便登錄系統后的其他頁面進行按語言顯示當然相關頁面需要支持多語言具體信息可參看使用 根據語言環境不同 而顯示不同的 資源本地化 ASP.NET 網頁 App_Code下定義基頁類 BasePage.cs Codeusin…

Java ClassLoader findSystemClass()方法與示例

ClassLoader類findSystemClass()方法 (ClassLoader Class findSystemClass() method) findSystemClass() method is available in java.lang package. findSystemClass()方法在java.lang包中可用。 findSystemClass() method is used to find the class with the given binary …

TFS 鏈接不上

C:\Users\Administrator>net use 會記錄新的網絡連接。 列表是空的。 C:\Users\Administrator>net use \\192.168.1.61\ipc$ wangkun /user:wangkun 命令成功完成。 轉載于:https://www.cnblogs.com/rhythmK/archive/2012/06/04/2534066.html

Linux內核設計與實現---虛擬文件系統

虛擬文件系統1 通用文件系統2 文件系統抽象層3 Unix文件系統4 VFS對象及其數據結構其他VFS對象5 超級快對象超級塊操作6 索引節點對象索引節點操作7 目錄項對象目錄項狀態目錄項緩存目錄項操作8 文件對象9 和文件系統相關的數據結構10 和進程相關的數據結構11 Linux中的文件系統…

Oracle 查詢歷史數據(轉帖)

回復誤刪除數據信息。 1、執行 alter table table_name enable row movement; 2、執行 FlashBack table table_name to timestamp to_timestamp(2012-05-24 14:59:36,yyyy-mm-dd hh24:mi:ss); 查詢歷史操作數據信息。 比較合理的方法是先從閃回區查找出被誤刪的數據&#xff0c…

Java里面的幾種路徑的區別

1&#xff0c;相對路徑 相對路徑就是指由這個文件所在的路徑引起的跟其它文件&#xff08;或文件夾&#xff09;的路徑關系。 也就是說&#xff1a; 對于如圖所示&#xff1a;一news.html為例 在WEB15工程下的WebContent下的WEB-INF下的news.html 當我訪問的news.html的時候…

Linux內核設計與實現---塊I/O層

塊I/O層1 解刨一個塊設備2 緩沖區和緩沖區頭3 bio結構體新老方法對比4 請求隊列5 I/O調度程序I/O調度程序的工作Linus電梯最終期限I/O調度程序預測I/O調度程序完全公正的排隊I/O調度程序空操作的I/O調度程序I/O調度程序的選擇系統中能夠 隨機訪問 固定大小數據片的設備被稱為塊…

Java字符類isUpperCase()方法與示例

角色類isUpperCase()方法 (Character class isUpperCase() method) isUpperCase() method is available in java.lang package. isUpperCase()方法在java.lang包中可用。 isUpperCase() method is used to check whether the given char value is uppercase or not. isUpperCas…

javascript:history.go()和History.back()的區別

javascript:history.go()和History.back()的區別收藏 <input typebutton value刷新 οnclick"window.location.reload()"> <input typebutton value前進 οnclick"window.history.go(1)"> <input typebutton value后…

sql查詢行轉列

--SQL 面試題 /* 問題&#xff1a;假設有張學生成績表(tb)如下: 姓名 課程 分數 張三 語文 74 張三 數學 83 張三 物理 93 李四 語文 74 李四 數學 84 李四 物理 94 想變成(得到如下結果)&#xff1a; 姓名 語文 數學 物理 ---- ---- ---- ---- 李四 74 84 94 張三 74 83 93 --…

算法---數

數1 最大公約數2 最小公約數3 進制轉換4 階乘統計階乘尾部0的個數5 字符串加法減法二進制加法6 多數投票問題數組中出現次數多于n/2的元素7 相遇問題改變數組元素使所有元素都相同1 最大公約數 歐幾里得算法&#xff1a;兩個整數的最大公約數等于其中較小的那個數和兩數相除余…

Java ByteArrayOutputStream reset()方法及示例

ByteArrayOutputStream類reset()方法 (ByteArrayOutputStream Class reset() method) reset() method is available in java.io package. reset()方法在java.io包中可用。 reset() method is used to reset this stream (i.e. it removes all currently consumed output in thi…