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