原文是在http://blog.csdn.net/jiangzhanchang/article/details/9998229 看到的,本文在原文基礎上增加了新的方法,並對多種數據類型做了更全面的對比。
首先列出代碼,以下是五種復制方式,我們首先來對字節數組進行測試。
第一種方法時用BinaryReader的方式讀取byte。
第二種是用先存到List,然后再用IList接口的CopyTo方法復制。
第三種直接使用的是Array的Copy。
第四種使用的是Array的ConstrainedCopy。
第五種則是Buffer的BlockCopy方法。
輸入測試代碼,為了具有對比性,我們一共循環五千萬次。
由於受計算機狀態影響,我們一共測試了5次來抵消不利因素。
可以看到性能表現最好的是Buffer.BlockCopy,而Array的兩個Copy方法也不遑多讓。另外兩個方法基本可以排除。
作為對比,我們用純賦值的方式再測一下。
可以看到,性能非常接近最佳。
接下來我們修改代碼,用Int32類型的數組進行復制。這里就無法使用Binary的方法了。
代碼略。
可以看到,類型的改變對效率變化沒有影響.
我們繼續改變數組的類型為string(引用類型)。
運行上述程序,會發生錯誤:
經過判斷,錯誤信息是由Buffer.BlockCopy發出的,也就是說,這個方法只支持基礎類型。
我們去掉這個方法,繼續執行。
和之前的差不多。
看到這里,孰勝孰敗相信大家心里已經有了答案。
根據CLR via C#這本書所說的,設計BlockCopy的目的實際是將按位兼容的數據從一個數組類型復制到另一個按位兼容的數據類型,比如Byte[]可以復制到Char[]。但同時也限制了其只能使用基元類型的數組。
要將一個數組元素可靠地復制到另一個數組,應該使用ConstrainCopy這個方法。該方法要么完成復制,要么拋出異常,總之不會破壞目標數組中的數據。
當然自己寫FOR循環賦值也未嘗不可。