• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

217
Views
¿Cómo se convierte una condición booleana en un tipo entero en Java sin bifurcar o saltar en el código de bytes compilado y el código de máquina JITed?

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?

about 3 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

Tabla de tipos nativos asignados a tipos Java

DARSE CUENTA:

  • Las primitivas int de Java ( jint ) están respaldadas por enteros con signo de 32 bits.
  • Las primitivas 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.

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error