정수 나누기가 느린 작업 (일반적으로 정수 곱하기보다 몇 배 느리다)은 잘 알려져 있습니다. 그러나 고정 제수로 여러 나누기 연산을 수행해야하는 경우 제수를 미리 조정하고 곱셈 및 비트 연산으로 "/"를 대체 할 수 있습니다 (Hacker's Delight의 10 장).Java에서의 빠른 정수 나누기
제물이 컴파일 타임 상수 (예 : static final long DIVISOR = 12345L;
) 인 경우 JVM에서 모든 작업을 곱셈 및 비트 연산으로 DIVISOR
으로 대체합니다. 저는 같은 종류의 속임수에서 흥미 롭습니다 만, 제수가 런타임에만 알려질 때. 예를 들어
, 다음 (느린) 방법 : 훨씬 빠르게 작업을 수행해야합니다
void reduceArrayFast(long[] data, long denominator){
SomeMagicStructure magic = computeMagic(denominator);
for(int i = 0; i < data.length; ++i)
// computes data[i]/denominator
data[i] = doFastDivision(data[i], magic);
}
, 모든
/
작업을 빠르게 대체하고 있기 때문에 :
void reduceArraySlow(long[] data, long denominator){
for(int i = 0; i < data.length; ++i)
data[i] = data[i]/denominator;
}
뭔가로 대체 할 수 (또한 분할이 CPU에서 파이프 라인 화되지 않기 때문에).