어느 시점에서 프로그램의 흐름이 두 개의 int 변수 "a"와 "b"가 0이 아닌지 여부에 의해 결정되는 Java로 코드를 작성하고 있습니다 (참고 : a와 b는 절대 음수가 아니며 정수 오버플로 범위 내에 있지 않음).
나는 그것을 평가할 수 있습니다
if (a != 0 && b != 0) { /* Some code */ }
또는 대안으로
if (a*b != 0) { /* Some code */ }
해당 코드 조각이 실행 당 수백만 번 실행될 것으로 기대하기 때문에 어느 코드가 더 빠를 지 궁금했습니다. 나는 무작위로 생성 된 거대한 배열에서 그것들을 비교하여 실험을했으며, 배열의 희소성 (데이터의 비율 = 0)이 결과에 어떤 영향을 미치는지 궁금합니다.
long time;
final int len = 50000000;
int arbitrary = 0;
int[][] nums = new int[2][len];
for (double fraction = 0 ; fraction <= 0.9 ; fraction += 0.0078125) {
for(int i = 0 ; i < 2 ; i++) {
for(int j = 0 ; j < len ; j++) {
double random = Math.random();
if(random < fraction) nums[i][j] = 0;
else nums[i][j] = (int) (random*15 + 1);
}
}
time = System.currentTimeMillis();
for(int i = 0 ; i < len ; i++) {
if( /*insert nums[0][i]*nums[1][i]!=0 or nums[0][i]!=0 && nums[1][i]!=0*/ ) arbitrary++;
}
System.out.println(System.currentTimeMillis() - time);
}
그리고 결과는 "a"또는 "b"가 ~ 3 % 이상의 0과 같을 것으로 예상하면 다음보다 a*b != 0
빠릅니다 a!=0 && b!=0
.
왜 그런지 궁금합니다. 누구나 빛을 비출 수 있습니까? 컴파일러입니까, 아니면 하드웨어 수준입니까?
편집 : 호기심에서 ... 이제 분기 예측에 대해 배웠으므로 OR b에 대한 아날로그 비교가 0 이 아닌지 궁금 합니다.
우리는 예상대로 분기 예측의 동일한 효과를 보았습니다. 흥미롭게도 그래프는 X 축을 따라 다소 뒤집 힙니다.
최신 정보
1- 나는 !(a==0 || b==0)
어떤 일이 일어나는지보기 위해 분석에 추가 했다.
2 나는 또한 포함 a != 0 || b != 0
, (a+b) != 0
그리고 (a|b) != 0
호기심, 분기 예측에 대한 학습 후. 그러나 OR b 만 true를 리턴하기 위해 0이 아니어도되므로 처리 효율성과 비교할 수 없기 때문에 다른 표현식과 논리적으로 동일 하지 않습니다.
3- 또한 분석에 사용한 실제 벤치 마크를 추가했는데, 이는 임의의 int 변수를 반복하는 것입니다.
4- 일부 사람들은에 대한 a != 0 & b != 0
반대 의견을 제안 했지만 분기 예측 효과를 제거 a != 0 && b != 0
하기 a*b != 0
때문에 더 밀접하게 작동 할 것이라는 예측이있었습니다 . &
부울 변수와 함께 사용할 수 있다는 것을 몰랐 습니다. 정수를 사용하는 이진 연산에만 사용되었다고 생각했습니다.
참고 :이 모든 것을 고려하고있는 맥락에서 int overflow는 문제가되지 않지만 일반적인 상황에서는 확실히 중요한 고려 사항입니다.
CPU : 2.3GHz에서 Intel Core i7-3610QM
Java 버전 : 1.8.0_45
Java (TM) SE 런타임 환경 (빌드 1.8.0_45-b14)
Java HotSpot ™ 64 비트 서버 VM (빌드 25.45-b02, 혼합 모드)
a != 0 & b != 0
.
a*b!=0
한 적은 지점이
(1<<16) * (1<<16) == 0
그러나 둘 다 0과 다릅니다.
a*b
하면 제로 하나 의 a
과가 b
제로; a|b
둘 다인 경우에만 0입니다.
if (!(a == 0 || b == 0))
? Microbenchmarks는 믿을 수 없을 정도로 악명 높으며, 이것은 실제로 측정 할 수 없을 것입니다 (~ 3 %는 나에게 오차 한계처럼 들립니다).