Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “if-else”和“if-else-if-else”之间有区别吗?_Java_Algorithm_Optimization_Assembly_Compilation - Fatal编程技术网

Java “if-else”和“if-else-if-else”之间有区别吗?

Java “if-else”和“if-else-if-else”之间有区别吗?,java,algorithm,optimization,assembly,compilation,Java,Algorithm,Optimization,Assembly,Compilation,在二进制搜索的文章中,有一个章节名为延迟相等检测,它介绍了二进制搜索的某种“优化”版本,如下所示: 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

二进制搜索
的文章中,有一个章节名为
延迟相等检测
,它介绍了二进制搜索的某种“优化”版本,如下所示:

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;  
}  
int二进制搜索(int A[],int key,int imin,int imax)
{  
while(imax>imin)
{  
int-imid=(imin+imax)/2;
if(一个[imid]<键)
imin=imid+1;
其他的
imax=imid;
}  
if((imax==imin)&&(A[imin]==key))
返回亚胺;
其他的
未找到返回键;
}  
据称,这是一个比传统教科书二进制搜索更好的版本,因为
。。。。算法每次迭代只使用一个条件分支

这是真的吗?我的意思是
if
指令在汇编中被翻译成
CMP
分支
指令,因此我无法想象
if-else
if-else


在更高层次的语言中,我是否应该考虑到这种差异?“差异化”版本的代码似乎更紧凑,但在如何形成
if-else
语句方面是否存在优化或惩罚?

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

也就是说,我不确定在使用优化的表单时是否会有可测量的差异。例如,考虑:

  • 如果您所比较的是两个整数,那么编译器可以检测到它可以只计算一次比较结果,然后计算要采用的分支
  • 二进制搜索是O(logN),因此即使要搜索的元素数量相当大,迭代次数实际上也非常少。你看不出有什么不同是有争议的
  • 现代CPU功能的实现,如推测性执行和分支预测(特别是在二进制搜索之类的“尼斯”算法中),可能比这种优化效果更明显(不过,这是我力所能及的)
  • 注意事项:


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

    我猜您的源代码所说的是汇编,而不是Java,在这种情况下,我认为它不适用。此外,我打赌它没有考虑到现代代码优化。此外,我希望这是一个学术问题,因为如果你是基于这种性能评估做出编程决策,那么这就是过早优化的定义。你没有展示其他选择,所以不可能知道你在说什么。@Gray:没有教科书,维基百科。这不是一个编程决定。只是在我的业余时间回顾一下basics@HotLicks:另一种选择是众所周知的
    if(a[mid]==key){}else if(a[mid]
    +1。这是有道理的。但是这篇文章的措辞似乎暗示了一些不同的东西(至少在我的理解上是这样的)在参考的维基百科文章中,有一个版本就在OP所描述的版本的正上方,如果(>)elseif(比较是现代CPU上最便宜的指令之一,最昂贵的部分是分支预测失误。因此,如果第二个版本没有帮助保存这些指令,则保存的周期数可以忽略不计。@spining_plate:理论上,它需要始终计算
    elseif(@Voo:我同意这一点,但我们可能不是在讨论整数,因此比较可能会花费任意的成本。