算法效率:我应该使用Equal(==)还是Not Equal(!=)运算符
本文关键字:Equal 还是 Not 运算符 效率 算法 我应该 | 更新日期: 2023-09-27 17:52:11
我想知道以下两个选项中哪一个在速度方面最有效。它们之间可能只有很小的差异(或者根本没有差异?(但由于我每天使用这段代码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"变量的值,这里真正的问题是"两者之间最快的运算符是什么"="answers"=="在c#中?">
两个比较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%的时候,你应该完全忽略这一点,但在某些罕见的情况下(比如你试图编写操作系统或模拟器的一部分,或者嵌入式设备的一些东西(,这一点变得很重要。
我认为效率会随着变量类型的不同而变化,所以就像Eric所说的,你真的需要测量它来找出答案。
然而,如果你问你应该用哪种方式写,我可以建议选项2(通常(更好。原因是,阅读时不带否定意味,这在心理上少了一步。由于代码只写一次,读多次,所以我们几乎总是应该把可读性作为我们的首要任务。只有当我们证明我们需要提高效率时,我们才应该开始提高效率
有一本很棒的书叫《代码完整》,里面谈到了我真正推荐的这类东西。