2016-08-11 2 views
2

나는 Leetcode에 조각을 구현 한 내 초기 루프는 다음과 같이 실행 :Java에서 값이 0인지 확인하는 것보다 값이 0보다 큰지 빠르게 확인하고 있습니까? 그렇다면 왜?

//n and x are an integer and a double respectively 
    long N = Math.abs((long)n); 
    double result = 1; 
    while(N != 0){ 
     if((N & 1) == 1){ 
      result *= x; 
     } 
     N = N >> 1; 
     x *= x; 
    } 

전체 코드가 실행 2ms의했다. 그런 다음 N != 0N > 0으로 변경했으며 코드를 실행하려면 1ms가 걸렸습니다. 왜이 변경으로 인해 런타임에 점프가 있었습니까? 즉, Java는 x != yx > y을 어떻게 구현합니까?

+2

한 번 테스트 했습니까? 각 실행과 결과 사이에 시간차가 있기 때문에 성능면에서 큰 차이가 있다고 실제로 말하지 않습니다. 그것은 단지 표준입니다 "이번에는 xms가 걸렸습니다", 다음에 그것은 vica 운문일지도 모릅니다. – SomeJavaGuy

+1

결함이 귀하의 테스트에있을 수 있습니다 생각 ... –

+1

[자바의 마이크로 벤치 마크] 쓰기 (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark) -in-java/513259)는 생각보다 훨씬 어렵습니다. 귀하의 측정치는 생각만큼 정확하지 않습니다. – Jesper

답변

-1

아마도 jvm이 N > 0을 검사 할 때 부호를 나타내는 바이트 만 보이고 jvm이 N != 0을 검사 할 때 변수의 모든 바이트를 처리해야하기 때문일 수 있습니다.

+1

요즘 모든 작업이 함께 64 비트이고 바이트가 CPU에 개별적으로로드되지 않는다면 요즘은 설명하는 내용이 아마도 적용되지 않을 것입니다. – RealSkeptic

+0

차이점은 1 바이트를 비교하고 'n'바이트를 비교할 수 있습니다. 한 번에 모두 CPU에로드 되더라도 검사를 수행해야하며 시간 측정에 차이가 발생할 수 있습니다. – Montreal

+1

어느 작업도 두 개 이상의 클럭 사이클을 필요로합니다. 이는 단일 기계 명령어 (IA-64에서)입니다. 그 차이는 실제로 존재하지 않는다. OP는 그 자신을 알아 차렸다. – RealSkeptic

관련 문제