컴파일 된 바이트 코드 및 JIT 된 기계 코드에서 분기하거나 점프하지 않고 Java에서 부울 조건을 정수 유형으로 변환하는 방법 [중복]
C / C ++에 대해 여기 에 제공된 예에서와 같이 :
... 이것은 Stefan Edelkamp와 Armin Weiss의 "BlockQuicksort : Branch Mispredictions가 Quicksort에 영향을주지 않는 방법"에 설명 된 새로운 기술 때문입니다. 간단히 말해, 스왑해야하는 요소 인덱스의 작은 버퍼 (전체적으로 L1 캐시에 있음)를 사용하여 분기 예측기를 우회합니다. 우리는 (의사 코드에서) 매우 우아한 분기없는 방식으로 이러한 버퍼를 채 웁니다.
buffer_num = 0; buffer_max_size = 64;
for (int i = 0; i < buffer_max_size; ++i) {
// With branch:
if (elements[i] < pivot) { buffer[buffer_num] = i; buffer_num++; }
// Without:
buffer[buffer_num] = i; buffer_num += (elements[i] < pivot);
}
분기 또는 점프없이 Java에서 어떻게 동일한 결과를 얻을 수 있습니까?
답변
불행히도 Java에서는 불가능합니다.
그 이유를 이해하려면 JVM 내의 Java 유형 뒤에 있는 기본 유형을 살펴보십시오 .

주의:
- Java
int
프리미티브 (jint
)는 부호있는 32 비트 정수 로 지원됩니다 . - Java
boolean
프리미티브 (jboolean
)는 8 비트 부호없는 정수 로 지원됩니다 .
점프 나 분기없이 둘 사이를 캐스트 할 수없는 이유는 캐스트가 반드시 부호있는 부호없는 비교를 포함하고 부호없는 부호없는 비교 에는 반드시 점프 또는 분기가 포함 되기 때문 입니다. 이 질문에 대한 대답 은 그 이유에 대한 좋은 설명을 제공합니다.
기본적으로 하드웨어 수준에서 프로세서 자체는 단일 작업으로 부호없는 비교를 수행 할 수 없습니다. 프로세서는 부호있는 비교와 부호없는 비교의 관점에서 비교를 수행해야합니다. 여기 에는 로직 트리가 필요하므로 점프 또는 분기도 필요합니다.
TL; DR : 는 서명되지 않고 서명되어 있으므로 변환에는 서명되지 않은 비교가 필요 하기 때문에 기본 수준에서 점프 또는 분기없이 Java에서 변환 int
을 boolean
수행 할 수 없습니다 .boolean
int