Como en el ejemplo dado aquí para C/C++:
... Esto se debe a una nueva técnica descrita en "BlockQuicksort: Cómo las predicciones erróneas de las ramas no afectan a Quicksort" por Stefan Edelkamp y Armin Weiss. En resumen, omitimos el predictor de bifurcación mediante el uso de pequeños búferes (totalmente en la memoria caché L1) de los índices de los elementos que deben intercambiarse. Llenamos estos búferes de una manera sin bifurcaciones que es bastante elegante (en pseudocódigo):
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); }
¿Cómo se puede lograr lo mismo en Java sin una rama o un salto?
Desafortunadamente, esto no es posible en Java.
Para comprender por qué, eche un vistazo a los tipos nativos detrás de los tipos de Java dentro de la JVM.
DARSE CUENTA:
int
de Java ( jint
) están respaldadas por enteros con signo de 32 bits.boolean
de Java ( jboolean
) están respaldadas por enteros sin signo de 8 bits.La razón por la que no se puede lanzar entre los dos sin un salto o bifurcación es que la conversión implica necesariamente una comparación con signo y sin signo, y la comparación con signo y sin signo implica necesariamente saltos o ramas. La respuesta a esta pregunta proporciona una buena explicación de por qué.
Básicamente, a nivel de hardware, el procesador en sí mismo no puede realizar comparaciones firmadas y no firmadas en una sola operación. El procesador tiene que hacer la comparación en términos de comparaciones firmado-firmado y sin firmar-sin firmar. Esto requiere un árbol lógico y, por lo tanto, también requiere saltos o bifurcaciones.
TL; DR: la conversión de int
a boolean
no se puede realizar en Java sin saltos o bifurcaciones en el nivel nativo, porque el boolean
no está firmado y el int
está firmado y, por lo tanto, una conversión requiere una comparación firmada y no firmada.