2016-12-01 45 views
7

我已经挖通过.NETExpressionVisitor,我发现这个for循环条件循环变量声明,对于在.NET中的源代码

for (int i = 0, n = nodes.Count; i < n; i++) 
{ 
    Expression node = Visit(nodes[i]); 
    if (newNodes != null) 
    { 
     newNodes[i] = node; 
    } 
    else if (!object.ReferenceEquals(node, nodes[i])) 
    { 
     newNodes = new Expression[n]; 
     for (int j = 0; j < i; j++) 
     { 
      newNodes[j] = nodes[j]; 
     } 
     newNodes[i] = node; 
    } 
} 

现在有没有什么特别的原因是:i = 0, n = nodes.Count; i < n

有没有从i = 0; i < nodes.Count以外的任何性能收益?

+1

在这个循环中,n也被用来计算节点的数量,只有一次开始,而不是每次迭代,我认为这是更好的方法。 –

回答

11

当您多次使用同一个语句时,最好使用变量。

这里,nodes.Count在以下两个地方使用,因此,使用变量而不是执行相同的语句两次。

for (int i = 0, n = nodes.Count; i < n; i++) { 

而且,

newNodes = new Expression[n]; 

注:由于在评论中讨论,性能差异完全可以忽略不计,但。

+0

虽然你没有错,但我觉得在这种情况下,性能差异是完全可以忽略不计的。 – Abion47

+3

@ Abion47它取决于Count属性中发生了什么。如果在每次调用时对元素进行计数,则它不可忽略,如果该属性返回已计算的全局变量,则创建该对象的计数可忽略不计。例如列表计数你没有问题。 – mybirthname

+0

@ Abion47是的你是对的:-)。这是一个代码最佳实践,所以如果你重命名节点,你不需要在多个地方重命名,尽管Visual Studio会为你做这件事。如果您在源代码控制中直接编辑它,例如'GitHub'和'BitBucket',将会发生什么情况。 – Aruna

2

我不认为它在这种情况下有任何性能影响。但是,当他们正在使用此n是此行也,

newNodes = new Expression[n];

所以,

  • 计划必须获得node.Count只有一次。
  • n不需要再次分配。
  • 看起来更清洁。

这就是它的全部。

+0

如果它计算node.count一次而不是在循环的每次迭代中计算,它如何没有任何性能影响? –

+0

这些是初始条件,它们只执行一次。它不会为每个循环设置“i = 0”。 – Prajwal

+0

我知道并且说了,正如你所说的“我认为它没有任何性能影响。”但是它的性能影响是count只计算一次,而不是在每次迭代中计算,如果循环只写入i = 0;我