题
什么是最快的方法的检查的条件
l + 1 < r
对于 int l,r
在Java?
l
和 r
不是恒定的,我知道 l <= r
.比较是停止的条件一 while
循环中二分搜索的执行。我当然的基准测试我的代码,无论是在一个单独的测试(搜寻一个大阵)和在代码,它使用它。
什么我找的,我想,是一些排序的一点操作,这将以更快的速度比本条件。但我不知道。
解决方案
我认为这可能和它一样快。这将简化为非常简单的字节码,而JIT(即时编译器)可能会将其简化为非常简单的本机实现。
(无关:有趣的是看到“量子开发”使用Java顺便说一句。经常不会发生这种情况)
其他提示
这种微优化几乎总是一个坏主意;如此小的性能将完全取决于热点编译器如何优化代码,以及与周围代码有关的微妙缓存效果。
以及潜在的比较必须是:
添加1至l、比较结果来r
或
从减去1r和比较结果来l
所有现代化的硬件会有同样的原始性能为任何操作(里加法和减法的任何原数据类型相同的业绩周期来完成和管道副作用)。
唯一的办法本会有任何效果是,如果:
一个我或是已知的常量在编译时间。例如。
l + 1 < 5
5 + 1 < r
在这种情况下一个贫穷的优化编译器可能没有意识到它可以转换成 l < 4
但 所有 java编译器所需的要点,第二种情况是 6 < r
另一个是如果数据类型的左右是不同的。
操作:
- 浮点加/减那么比较一个int
诗句 - 组成加/减法则比较有一双可以是不同的。
它是公平地说,机会,这是一个严重的问题,在应用程序可以忽略不计,因为该循环成本的任何这些是微小的比管道打的任何分支误预测相关的决定。
还有一个体面的JIT可能做各种各样的优化有关的包围码,超过了微优化执行。
变量 lr1
总是等于(l - r + 1)
。无论何时递增或递减 l
,都要对 lr1
执行相同的操作。同样适用于 r
。
然后你的测试变成(lr1&lt; 0)
,并且修改 lr1
的指令不会经常执行。
我觉得有点愚蠢给你一个微观优化,在大多数情况下是一分钱一分钱,愚蠢的。就像你在比较字符串一样,它会完全淹没那个测试。
补充:既然你正在进行二元搜索,我会提到Jon Bentley很酷的二进制搜索展开。首先,你将表 A
填充到2的幂,如1024.然后你写这样的东西:
i = 0;
if (X >= A[i+512]) i += 512;
if (X >= A[i+256]) i += 256;
. . .
if (X >= A[i+ 1]) i += 1;
最后测试(X == A [i])
。或者,如果你不想填充它,让 if
语句类似于
if(i + 512&lt; N&amp;&amp; X&gt; = A [ i + 512])i + = 512;
所有这些家伙都说了些什么。编译器将为您优化它。写下来让它看起来并正确地读给你并继续前进。
最好的办法是调整JVM而不是代码 - 假设这是你的瓶颈。
尝试使用参数 -server -XX:+ AggressiveOpts
启动jvm。
如何在while循环之外移动相等测试,因此只有在终止后才能检查 .equals()。顺便说一下,我找不到任何方法来测试是否l + 1