题
会有之间巨大的性能差异:
if (this.chkSelectAll.Checked)
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
this.listBoxColumns.SetSelected(i, true);
else
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
this.listBoxColumns.SetSelected(i, false);
VS
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
this.listBoxColumns.SetSelected(i, this.chkSelectAll.Checked);
哪一个是可取的。简明编码与性能增益?
解决方案
我不希望看到太多性能上的差异,我肯定会用后者去,因为它更具有可读性。 (我把括号轮它虽然。)
这是很容易想象一个情况下,你可能需要更改循环,并与第一例子中,你可能会意外地只改变他们,而不是两者之一。如果你的真正的要避免调用Checked
酒店的每一次迭代中,你总是可以做:
bool checked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
{
this.listBoxColumns.SetSelected(i, checked);
}
与以往一样,先写最可读代码,和弯曲设计/代码变了形为的性能起见前措施/配置文件的任何性能差异。
其他提示
我想的性能差异将是几乎没有明显的。然而这里的变化既高效和高度可读:
bool isChecked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++) {
this.listBoxColumns.SetSelected(i, isChecked);
}
如果您之后您还需要注意访问“this.listBoxColumns”两次,每次迭代的开销是否存在摆在首位,是值得关注的一些真正的优化是。这就是分析是。
您必须在第一个例子中的额外的布尔检查。不过话说回来,我无法想象的性能差异会比可以忽略不计的任何其他。您是否尝试过在您的特定情况衡量呢?
在第二个例子是优选的,因为你不重复循环代码。
我看不到有作为两者之间的显著的性能差异。的方式进行确认。将超过迭代1000设置一个基准和时间不同的算法。
然而,因为它的UI代码的性能提升是毫无意义的,你将要等待用户阅读对话,并决定下一步该怎么做。
我个人会去每一次的第二种方法。你只得到了一个循环来维持,并且代码更清晰。
的任何性能差异可以忽略不计。
您主要关注应该代码可读性和可维护性。
微的优化像这样的往往不是,错位。被关注的性能之前,始终轮廓。
为什么不使用System.Diagnostics.StopWatch和比较两个自己呢?不过,我不相信有将是任何真正的性能差异。第一个例子可能会更快,因为你只访问一次chkSelectAll.Checked。两者都是容易可读虽然。