可能有人认为相比于 ForTest1,ForTest2 存储了数组的 Length,少了对于数组属性的频繁调用,会有更好的性能表现。
1 | using System; |
以下 是 上段代码编译出的 IL code:(以下所述栈均为操作数栈 (Operand stack))
1 | .method private hidebysig static void ForTest1() cil managed |
1 | .method private hidebysig static void ForTest2() cil managed |
对比上述的 IL code,确实临时存储数组长,能够少在 for 的比较进行中少进行一定的操作,无需将数组从局部变量表(Local Variable Table)入操作数栈 (Operand stack),并执行 ldlen 获取数组长。 但要注意, JIT 编译器知道 Length 是 Array 类的属性,生成的代码中只会调用该属性一次,结果会存储到临时变量中,此后的检查中调用的都是此临时变量。不需要自己用局部变量做缓存,这样既没有性能提升,还可能造成可读性下降。
参阅
CLR via C# (第四版) 16.7 数组的内部工作原理
注释
一般,该工具位于 NETFX 4.7.2 Tools 中
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64\ildasm.exe