C#中各种数组的性能比较
2010-09-30 22:38:05 来源:WEB开发网代码比较长,前面基本都是初始化的代码,大家不用太关心,但是大家明显能看到一维0基的交错数组同样也可以利用IL为一维0基数组提供的特殊指令,所以性能和一维0基数组相同,唯一的不同是多了一次嵌套数组的访问!
3,多维数组:
多维数组一般大家可能直观上的认为多维数组的性能也应该不错,因为而多维数组当中,由于用于存储元素的内存空间是连续的,而且数组的每一维元素个数固定,所以可以轻易的根据元素各维的索引值计算出元素在数组内存中偏移量,比如,一个多维数组arr[6,7],元素arr[2,4]的偏移量是2*7+4,事实证明这种直观看法并不正确,我们看如下代码:
int[,] arr = new int[5,6];
int i = arr[3, 4];
生成的IL代码如下:
.entrypoint
// 代码大小 19 (0x13)
.maxstack 3
.locals init ([0] int32[0...,0...] arr,
[1] int32 i)
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: ldc.i4.6
IL_0003: newobj instance void int32[0...,0...]::.ctor(int32,
int32)
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: ldc.i4.3
IL_000b: ldc.i4.4
IL_000c: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_0011: stloc.1
IL_0012: ret
大家都知道,数组是继承于Array的引用类型,这里int32[0...,0...]类型就是CLR为多维数组构造的一个类型,Get(int32,int32)方法是CLR为这个类型构造的一个方法,类似的方法还有:
int Get(int d1, int d2); //获取特定元素的值
void Set(int d1, int d2, int v); //设置特定元素的值
int* Address(int d1, int d2); //获取特定元素的地址
函数调用本身是比较耗时的,因为它包含了参数的压栈出栈,以及程序控制流的转移等,显然,多维数组的这种通过函数调用来访问元素的方式没有一维0基的交错数组直接使用IL指令的方式快!
更多精彩
赞助商链接