`if else`和`if-else if-else`之间有区别吗?

时间:2012-04-25 15:42:26

标签: java algorithm optimization assembly compilation

Binary Search的{​​{1}}文章中,有一个名为Deferred detection of equality的部分,它提供了一个有点“优化”的二进制搜索版本,如下所示:

int binary_search(int A[], int key, int imin, int imax)  
{  
  while (imax > imin)  
  {  
    int imid = (imin + imax) / 2;  
    if (A[imid] < key)  
      imin = imid + 1;  
    else  
      imax = imid;  
  }  
  if((imax == imin) && (A[imin] == key))  
    return imin;  
  else  
    return KEY_NOT_FOUND;  
}  

据称,这是一个比传统教科书二进制搜索更好的版本,因为.... algorithm uses only one conditional branch per iteration
这是真的?我的意思是if指令已在汇编中的CMPBranch指令中翻译,因此我无法想象if-else如何优于if-else if-else 是否有这样的差异,我应该在更高级别的语言中考虑?我所说的“deffered”版本的代码似乎更紧张,但是你在如何形成if-else语句时会有优化或惩罚吗?

1 个答案:

答案 0 :(得分:3)

关键概念是它每次迭代使用一个较少的条件 。也就是说,等式检查已移到while循环之外,因此它只运行一次,而在基本版本中,每次都需要检查¹。

那就是说,我不确定在使用优化形式时是否确实存在可衡量的差异。例如,考虑一下:

  1. 如果您要比较的只是两个整数,那么编译器可以检测到它只能计算一次比较结果,然后再评估哪个分支。
  2. 二进制搜索是O(logN),因此即使要搜索的元素数量非常大,所以迭代次数实际上也非常小。你是否看到有任何区别是有争议的。
  3. 现代CPU功能的实现,例如推测性执行和分支预测(特别是在“漂亮”算法,如二进制搜索),可能会比这种优化具有更明显的效果(尽管我的联盟不在内)。
  4. 备注:

    ¹实际上它是另一个条件,当相等比较移出时不需要检查,但概念上没有区别。