性能:List.Count与检查存储的变量

Stu*_*urm 15 c# performance loops count

我想知道这是否有所不同:

 for (int i = 0; i < values.Count; i++)
        {
            //
        }
Run Code Online (Sandbox Code Playgroud)

VS

int num = values.Count;

for(int=0; i<num; i++)
{

}
Run Code Online (Sandbox Code Playgroud)

我认为第二种方法更好,因为您不需要计算每次迭代中的所有项目.但我可能错了.有人可以照亮我吗?

Bas*_*Bas 14

该列表已在Count内部存储.您正在进行的比较与代码样式有关,而与性能无关.由于编译器将优化'Count'的检索

  • 编译器无法优化对"Count"的检索,这是另一个对象的可变属性.我对优化IL的实验表明,每次迭代都会重新读取`Count`. (2认同)
  • @spender是的,但每次都从固定内存偏移量读取`num`变量.所以他们应该是同等速度? (2认同)

Pro*_*ega 12

那么你可以在这里查看.NET源代码 http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#aa7e01fcb80a917e

  public int Count {
        get {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return _size; 
        }
    }
Run Code Online (Sandbox Code Playgroud)

看来列表中的.Count属性会进行快速内部检查,然后返回_size.所以它应该非常接近你自己存储值的性能.