문제

상태를 확인하는 가장 빠른 방법은 무엇입니까?

l + 1 < r

~을 위한 int l,r 자바에서?

l 그리고 r 일정하지 않으며 나는 그것을 알고 있습니다 l <= r. 비교는 a while 이진 검색 구현에서 루프. 물론 별도의 테스트 (큰 배열 검색)와이를 사용하는 코드 모두에서 코드를 벤치마킹하고 있습니다.

내가 찾고있는 것은 현재 조건보다 빠른 일종의 비트 작업입니다. 그러나 나는 모른다.

도움이 되었습니까?

해결책

아마도 그것이 얻을만큼 빠르다고 생각합니다. 이는 매우 간단한 바이트 코드로 축소되며 JIT (정시 컴파일러)는 아마도 매우 간단한 기본 구현으로 줄일 것입니다.

(관련이없는 : 'Quant Dev'를 보는 것은 흥미로운 Java Btw를 사용합니다. 자주 일어나지 않습니다)

다른 팁

이런 종류의 미세 최적화는 거의 항상 나쁜 생각입니다. 이러한 작은 비트의 성능은 핫스팟 컴파일러가 코드를 최적화하는 방법과 주변 코드와 관련된 미묘한 캐시 효과에 전적으로 의존합니다.

기본 비교는 다음과 같습니다.

1에 1을 추가하고 결과를 R과 비교하십시오.

또는

R에서 1을 빼고 결과를 L과 비교하십시오.

모든 최신 하드웨어는 작업에 대해 동일한 원시 성능을 갖습니다 (기본 데이터 유형의 추가 및 뺄셈은 순환 및 파이프 라인 부작용 측면에서 동일한 성능을 갖습니다).

이것이 효과가있는 유일한 방법은 다음과 같습니다.

L 또는 R 중 하나는 컴파일 시간에 알려진 상수입니다. 예를 들어.

l + 1 < 5
5 + 1 < r

이 경우 열악한 최적화 컴파일러는 첫 번째를 l < 4

하지만 모두 Java 컴파일러는 두 번째 케이스가 6 < r

다른 하나는 L과 R의 데이터 유형이 다른 경우입니다.

작동 :

  1. 플로팅 포인트 추가/뺄셈 후 int와 비교
    구절
  2. 적분 첨가/빼기 그런 다음 이중과 비교하는 것은 다를 수 있습니다.

신청에서 심각한 문제가 될 가능성은 무시할 수 없다고 말하는 것은 공평합니다. 이들 중 하나의주기 비용은 결정과 관련된 지사 오해의 파이프 라인에 비해 작기 때문에 무시할 수 있습니다.

또한 괜찮은 JIT는 수행 된 마이크로 최적화를 능가하는 주변 코드와 관련하여 모든 종류의 최적화를 수행 할 수 있습니다.

변수가 있습니다 lr1 항상 동일합니다 (l - r + 1). 증가하거나 감소 할 때마다 l, 똑같이하십시오 lr1. 마찬가지로 r.

그런 다음 테스트가됩니다 (lr1 < 0), 및 수정 지침 lr1 필요한 것보다 더 자주 실행되지 않습니다.

나는 당신에게 미세 최적화를 제공하는 약간 바보 같은 느낌이 듭니다. 문자열을 비교하는 것처럼, 그것은 그 테스트를 완전히 늪에 빠뜨릴 것입니다.

추가 : 이진 검색을하고 있기 때문에 Jon Bentley의 멋진 이진 검색을 언급 할 것입니다. 먼저 테이블을 채 웁니다 A 1024와 같이 최대 2의 힘. 그런 다음 다음과 같은 글을 씁니다.

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 < N && X >= A[i+512]) i += 512;

이 모든 사람들이 말한 것. 컴파일러는 당신을 위해 그것을 최적화 할 것입니다. 당신을 제대로보고 읽고 계속 진행하도록 글을 쓰십시오.

가장 좋은 방법은 코드가 아닌 JVM을 조정하는 것입니다.

인수로 JVM을 시작하십시오 -server -XX:+AggressiveOpts.

while 루프 외부에서 평등 테스트를 이동하는 것은 어떻습니까? .equals () 종료 후에 만. btw 나는 l+1을 테스트 할 수있는 약간의 twiddling 방법을 찾을 수 없었다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top