检查条件l+;1<;r代表int l,r在Java中
检查病情的最快方法是什么检查条件l+;1<;r代表int l,r在Java中,java,performance,integer,Java,Performance,Integer,检查病情的最快方法是什么 l + 1 < r l+1
l + 1 < r
l+1
对于Java中的intl,r
l
和r
不是常数,我知道l我认为这可能是最快的。这将简化为非常简单的字节码,而JIT(即时编译器)可能会将其简化为非常简单的本机实现
(无关:看到“定量开发人员”使用Java btw很有趣。这种情况并不经常发生)我认为这可能是最快的。这将简化为非常简单的字节码,而JIT(即时编译器)可能会将其简化为非常简单的本机实现
(无关:有趣的是看到“定量开发人员”使用Java btw。这种情况并不经常发生)这种微观优化几乎总是一个坏主意;这样一小段代码的性能将完全取决于hotspot编译器如何优化代码,以及与周围代码有关的细微缓存效果。这种微优化几乎总是一个坏主意;这一小段代码的性能将完全取决于hotspot编译器如何优化代码,以及与周围代码有关的细微缓存效果。所有这些家伙都说了些什么。编译器将为您优化这一点。把它写下来,让它看起来和读起来对你来说都是正确的,然后继续前进。这些家伙都说了些什么。编译器将为您优化这一点。写下它,使它看起来和读起来对你来说都是正确的,然后继续。那么,基本的比较必须是:
将1添加到l,将结果与r进行比较
或
从r中减去1,并将结果与l进行比较
所有现代硬件在这两种操作中都具有相同的原始性能(任何本机数据类型的加法和减法在完成周期和管道副作用方面具有相同的性能)
唯一有效的方法是:
l或r中的一个是编译时的已知常量。例如
l + 1 < 5
5 + 1 < r
l+1<5
5+1
在这种情况下,一个糟糕的优化编译器可能没有意识到它可以将第一个编译成l<4
但是,所有java编译器都需要发现第二种情况是6
另一个是如果l和r的数据类型不同
操作:
浮点加法/减法,然后与整数进行比较
诗句
积分加减法与双精度加减法的比较可能会有所不同
可以公平地说,在您的应用程序中,这是一个严重问题的可能性微乎其微,因为与与决策相关的任何分支预测失误的管道命中相比,任何一个问题的周期成本都很小
此外,一个好的JIT可能会对周围的代码进行各种各样的优化,这些优化超过了所执行的微观优化。那么底层的比较必须是:
将1添加到l,将结果与r进行比较
或
从r中减去1,并将结果与l进行比较
所有现代硬件在这两种操作中都具有相同的原始性能(任何本机数据类型的加法和减法在完成周期和管道副作用方面具有相同的性能)
唯一有效的方法是:
l或r中的一个是编译时的已知常量。例如
l + 1 < 5
5 + 1 < r
l+1<5
5+1
在这种情况下,一个糟糕的优化编译器可能没有意识到它可以将第一个编译成l<4
但是,所有java编译器都需要发现第二种情况是6
另一个是如果l和r的数据类型不同
操作:
浮点加法/减法,然后与整数进行比较
诗句
积分加减法与双精度加减法的比较可能会有所不同
可以公平地说,在您的应用程序中,这是一个严重问题的可能性微乎其微,因为与与决策相关的任何分支预测失误的管道命中相比,任何一个问题的周期成本都很小
此外,一个好的JIT可能会对周围的代码进行各种优化,这些优化超过了所执行的微优化。您最好的选择是调整JVM,而不是代码,因为这是您的瓶颈
尝试使用参数-server-XX:+AggressiveOpts
启动jvm,最好的办法是调整jvm而不是代码,因为这是您的瓶颈
尝试使用参数-server-XX:+AggressiveOpts
启动jvm,变量lr1
始终等于(l-r+1)
。无论何时增加或减少l
,都要对lr1
执行相同的操作。类似地,对于r
然后您的测试变为(lr1<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=A[i+512])i+=512
有一个变量lr1
,它总是等于(l-r+1)
。无论何时增加或减少l
,都要对lr1
执行相同的操作。类似地,对于r
然后,您的测试将变为(lr1<0)
,并显示要修改的说明