dur*_*597 24 java performance xor
我需要检查两个整数是否在零的同一侧多次.我不在乎它是积极的还是消极的,只是它是同一面......并且表现非常重要.
目前我这样做:
if (int1 == 0 || int2 == 0) {
// handle zero
} else if ((int1 ^ int2) > 0) {
// different side
} else {
// same side
}
Run Code Online (Sandbox Code Playgroud)
这比速度提高30%(用卡尺测试)更明显:
if ((int1 > 0 && int2 > 0) || (int1 < 0 && int2 < 0)) {
Run Code Online (Sandbox Code Playgroud)
可以更快地完成吗?
如果有人想看到我用于30%的测试框架,它就在这里.我用了卡尺0.5-rc1
注意:所有这些解决方案都检查第一位,基本上,零与正数相同.因此,如果它适用于您的应用程序,则无需进行零检查.
基准清单:
((&&)||(&&))解决方案(>>31) == (>>31)(0x80000000)==不使用^(^)>>31 == 00% Scenario{vm=java, trial=0, benchmark=XOR} 1372.83 ns; ?=7.16 ns @ 3 trials
17% Scenario{vm=java, trial=0, benchmark=Ifs} 2397.32 ns; ?=16.81 ns @ 3 trials
33% Scenario{vm=java, trial=0, benchmark=Bits} 1311.75 ns; ?=3.04 ns @ 3 trials
50% Scenario{vm=java, trial=0, benchmark=XorShift} 1231.24 ns; ?=12.11 ns @ 5 trials
67% Scenario{vm=java, trial=0, benchmark=BitAndXor} 1446.60 ns; ?=2.28 ns @ 3 trials
83% Scenario{vm=java, trial=0, benchmark=BitAndEquals} 1492.37 ns; ?=14.62 ns @ 3 trials
benchmark us linear runtime
XOR 1.37 =================
Ifs 2.40 ==============================
Bits 1.31 ================
XorShift 1.23 ===============
BitAndXor 1.45 ==================
BitAndEquals 1.49 ==================
vm: java
trial: 0
Run Code Online (Sandbox Code Playgroud)
看起来@aaronman是赢家
aar*_*man 12
(int1 ^ int2) >> 31 == 0 ? /*on same side*/ : /*different side*/ ; 这不一定正确地处理0我不确定在那种情况下你想做什么.
编辑:还想指出,如果这是在c而不是java,它可以通过摆脱== 0因为布尔在c中的工作方式进一步优化,案件将切换虽然