我想知道以下两个选项中的哪一个在速度方面效率最高。它们之间可能只有很小的区别(或者根本没有区别?)但是由于我每天使用30次代码片段,我想知道这里的“最佳实践”是什么:)
选项1:
if (sender != null)
LabelSave.Text = "Saved";
else
LabelSave.Text = "Auto-Saved";
选项2:
if (sender == null)
LabelSave.Text = "Auto-Saved";
else
LabelSave.Text = "Saved";
请不要考虑“sender”变量的值,这里真正的问题是“在c#中,”=“和”==“之间最快的运算符是什么?”
答案 0 :(得分:3)
两次比较sender == null
和sender != null
需要相同的时间*。
最佳做法是使用最易读或易懂的,这取决于具体情况。
例如:
if (condition) {
...
lots_of_code();
...
return;
}
short_code();
return;
如果写成:
,这可能会更具可读性if (!condition) {
short_code();
return;
}
...
lots_of_code();
...
return;
在第二个版本中,更多代码位于较低的范围,因此通常更容易理解。
*注意:如果您运行这种检查数百万次并且它确实成为性能问题(不太可能),您需要了解编译器的工作原理。大多数编译器都采取类似的方式:
if (condition) {
do_something();
} else {
do_other_thing();
}
return;
并制作如下指令:
evaluate condition
jump_if_false ELSECODE
do_something()
return
ELSECODE:
do_other_thing()
return
当condition
为真时跳过跳转通常比跳转时稍微便宜一些。这取决于if
语句之后立即执行的操作。编译器通常会尝试在编译时猜测哪个分支更有可能并相应地排列代码,而CPU可以在运行时进行分支预测,以便以不同的方式对其进行优化。对于某些语言/编译器,您可以提示condition
极有可能或极不可能。
99.99%的时间你应该完全忽略这一点,但在极少数情况下它会变得很重要(例如,如果你试图编写操作系统或模拟器的一部分,或嵌入式设备的某些部分)。
答案 1 :(得分:1)
我认为效率会根据变量类型而改变,所以就像Eric说的那样,你真的需要测量它才能找到答案。
但是,如果你问的是应该用哪种方式来写,我可以建议选项2(通常)更好。原因在于,如果没有否定,它就会减少阅读的精神步骤。由于代码只编写一次并且多次读取,因此我们应该始终将可读性作为首要任务。一旦我们证明了我们需要,我们就应该开始着手提高效率。
有一本名为Code Complete的好书,讲的是我真正推荐的这类东西。