什么是更快:很多ifs,否则如果?

ond*_*aco 22 php micro-optimization

我正在迭代一个数组并按值将其分类为一周中的几天.

为了做到这一点,我使用了许多if陈述.如果我使用多个ifs而不是一组else if语句,它对处理速度有什么影响吗?

Jam*_*s B 46

是的,如果使用else,请考虑以下代码:

if(predicateA){
  //do Stuff
}
if(predicateB){
  // do more stuff
}
Run Code Online (Sandbox Code Playgroud)

if(predicateA){
  //
}
else if(predicateB){
  //
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,如果predicateA为true,则不需要评估predicateB(以及任何进一步的谓词)(因此整个代码将执行得更快),而在第一个示例中,如果predicateA为true,则仍然会始终对predicateB进行求值,如果谓词A和谓词B不相互排斥,你也可能会有一些意想不到的惊喜.

  • 实际上,你的例子是错误的,因为如果PredicateA和PredicateB都可以使用它们,它们就不会这样做.你只会执行第一个并退出.而第一个代码将执行两个. (6认同)
  • 要实际看到性能差异需要相当多的条件,然而+1似乎无论如何都是正确的方式. (2认同)

duf*_*ymo 18

我怀疑像这样的微优化会在代码中产生可测量的差异.

您的排序算法更有可能成为性能问题的根源.您选择哪种排序算法至关重要,没有多少"ifs"与"else if".

更新:

由于其早期退出和排他性逻辑特征,其他人提出的关于"否则如果"是更好的选择的观点表明,在这种情况下它应优先于"if".

但关于算法选择的观点仍然存在 - 除非你的数据集非常小.

很明显,O(log n)会优于O(n ^ 2),但数据集的大小也很重要.如果您只有几个元素,您可能不会注意到差异.在这种情况下,编写一个最简洁,最易读,最容易理解的低效方法一目了然可能是你最好的选择.

  • 大多数排序算法使用嵌套循环或递归以及大量比较来对给定集合进行排序.根据他在代码的这个关键部分中进行的比较,早期淘汰和跳过不必要的比较可能会导致显着的性能提升. (5认同)
  • if-else 是否也有助于可读性,并给编译器一个像样的提示? (2认同)

Roc*_*och 10

你可以看一下phpbench

但说实话,如果你想在这个级别进行优化,你可能想要学习除了php以外的东西.

替代文字


Jam*_*mes 8

说实话,我不认为你在性能方面做到这一点很重要,我怀疑你会看到任何不同.我建议使用一个不是性能增强的switch语句,只是语法上更好:

switch ($day) 
{
    case "Monday":
        // do something with Monday
        break;
    case "Tuesday":
        // do something with Tuesday
        break;
    case "Wednesday":
        // do something with Wednesday
        break;
}
Run Code Online (Sandbox Code Playgroud)


Lau*_*ent 5

我做了一个基准,看看连续的 if() 和 if() 之间是否存在真正的区别,然后是一些 elseif()

我放置了一个大字符串,并使用这两种方法每次执行大约 20 strpos() (x100 000),它显示了以下结果:

Try 1 : 0.5094 (including elseif)
Try 2 : 0.6700 (including only if)
Run Code Online (Sandbox Code Playgroud)

毫无疑问。我已经知道连续的 elseif() 更快,即使中间有一个 return ;在答案中加入一些统计数据仍然很好。