C# 4.0 关于“中的速度”;至于;

C# 4.0 关于“中的速度”;至于;,c#-4.0,.net-4.0,C# 4.0,.net 4.0,有一项任务是要知道哪种代码更快以及为什么: //A Stopwatch sw = new Stopwatch(); Int32[] a = new Int32[10000000]; int len = a.Length; sw.Start(); //for (Int32 index = 0; index < len; index++) //{ // a[index] =

有一项任务是要知道哪种代码更快以及为什么:

//A
        Stopwatch sw = new Stopwatch();
        Int32[] a = new Int32[10000000];
        int len = a.Length;
        sw.Start();
        //for (Int32 index = 0; index < len; index++)
        //{

        //    a[index] = 6;
        //}
        //sw.Stop();


//B
        for (Int32 index = 0; index < a.Length; index++)
        {

            a[index] = 6;
        }
        sw.Stop();

        var time = sw.ElapsedMilliseconds;
/A
秒表sw=新秒表();
Int32[]a=新的Int32[10000000];
int len=a.长度;
sw.Start();
//对于(Int32索引=0;索引

方法B的平均时间比A多一点。有人解释原因吗?

在案例B中,每次通过循环,运行时都调用代码来获取数组的长度

在A中,此操作执行一次并保存结果


我一直认为运行时会优化这个循环,它们是一样的。你的结果有显著不同吗?您是否运行了几次测试以查看它是否始终不同?

我的猜测可能是因为您每次循环时都在轮询数组的长度,而a方法只需要检查缓存的长度值。因此,归根结底,这归结为一个想法,即除了作为一个有缺陷的微观基准之外,我怀疑
a.Length
可能比
len
花费“多一点时间”。(例如,在MSIL和生成的JIT代码中,编译器和JIT'er可以更积极地缓存局部变量
len
。如果
a.Length
产生了副作用,或者如果backing属性值发生了变化,该怎么办?显然,这是无法解释的!)然而,最终:这并不重要。尽管,我想一个“更好”的问题可能是:“为什么JIT不优化array.Length以及它优化array.Length的局部变量副本?”更集中的查询实际上可能会指向某个地方(例如,因为可以假设数组的长度是固定的,并且我认为可以在这里优化对
a
的访问)。。。并且需要查看精确的JIT指令。但最后,我发现这并不是什么特别有趣的事情:-/