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