在了解了.net中数组的实际实现之后,再回到我们关于性能的讨论上来:众所周知,函数调用本身是比较耗时的,因为它包含了参数的压栈出栈,以及程序控制流的转移。因此,诸如c++这样的语言需要提供函数内联(inline)的方式以提高函数调用的性能(关于.net中对于函数内联的支持可以参考条款x)。而直接使用msil指令增加了在即时编译(jit compile)过程中进一步优化的机会。
看来这一次我们险些被自己的直觉所欺骗了,在.net中应该是嵌套数组提供了更加优越的性能。但有些看过条款x的读者可能还心存疑问:你怎么知道像get、set这样的函数在jit编译过程中不会采用内联形式编译呢?
很难证明一个函数确实以内联形式嵌入了调用的代码,尤其是在jit环境下。但有一些简单的办法可以证明jit编译器根本不会尝试将一些函数进行内联编译——比如采用类型反射(refelection):
int[,] mda = new int[3,3]; //定义mdarray