算法效率:我应该使用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#中?">

算法效率:我应该使用Equal(==)还是Not Equal(!=)运算符

两个比较sender == nullsender != 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(通常(更好。原因是,阅读时不带否定意味,这在心理上少了一步。由于代码只写一次,读多次,所以我们几乎总是应该把可读性作为我们的首要任务。只有当我们证明我们需要提高效率时,我们才应该开始提高效率

有一本很棒的书叫《代码完整》,里面谈到了我真正推荐的这类东西。