源地址:http://www.companysz.com/yongbufangqi1988/archive/2010/06/10/1755863.html
多維數組的三種技術:安全數組訪問技術、安全交錯數組訪問技術和非安全指針訪問技術。時間 = 數組生成時間 + 數組元素訪問時間1、安全數組訪問技術:創建較快,訪問最慢 安全數組訪問技術最慢。無專用的IL指令。 安全數組對象生成速度較快,數組的空間是連續的,產生的垃圾少。 結論: 如果需要創建大量多維數組,而且并不想頻繁地訪問這些元素,創建多維數組更快一些。2、安全交錯數組訪問技術:創建較慢,訪問較快 交錯數組訪問技術較快。因為有專用的1維0基數組的IL指令。 交錯數組對象生成速度慢,數組的空間是不連續的,產生的垃圾多。 結論: 如果只需要創建一次多維數組,而且要頻繁地訪問該數組中的元素,交錯數組數組訪問較快一些。3、非安全指針訪問技術:創建較快,訪問最快 非安全數組對象生成速度較快,數組的空間是連續的,產生的垃圾少。 非安全數組訪問技術的速度非常快。因為使用了非安全的指針。 結論: 在性能第一的情況下,可采用非安全指針訪問技術。 缺點: 這種技術允許在訪問數組時關閉索引邊界檢查。如果這些內存訪問是在邊界之外,不會拋出異常, 但可能損壞內存中的數據,破壞類型安全性,進而造成安全漏洞。
下面我會根據例子和內存分布圖,來說明他們的性能:
1、安全數組訪問技術:int[,] a=new int[2,3];
在內存中會形成如下圖:
c#中clr把多維數組都看做是非0基數組,那么每次clr都會從索引值中減去偏移量來檢查數組是否越界,這樣效率肯定不會有多高。
2、安全交錯數組訪問技術:int[][] a=new int[2][3];
在內存中會形成如下圖所示:
這樣看到這個安全交錯數組實際上是由3個0基一維數組組成,一維0基數組有特殊IL指令,而且這些特殊的IL指令會導致JIT編譯器生成優化的代碼,性能是最佳的,故他要比安全數組性能要好。
3、非安全指針訪問技術:public static int[,] a=new int [,]{{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
public unsafe static void main()
fixed(int* py=&a[2,1])
{
int* p=py;
for(int i=0;i<3;i++)
{
p++;
*p=10;
}
foreach(int i in a)
{
console.writeline(i);
}
}
運行結果為:1 2 3 4 5 6 7 8 19 20 21
內存圖如下:
新聞熱點
疑難解答