Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

180
Views
¿Un compilador de Java optimiza las instancias ad hoc de `Set.of`, `List.of` y `Map.of` en bucles como constantes?

Dado el siguiente fragmento de código en el que se crea una instancia ad hoc de un Set , ¿ verá el compilador de Java de hoy que no es necesario crear la instancia para cada pase de ciclo y optimizar el set como una especie de constante final de modo que la instancia sea la lo mismo para todo el bucle? La pregunta se aplica de manera similar a los bucles while y do while while.

 for (/* a loop that iterates quite often */) { var set = Set.of("foo", "blah", "baz"); // Do something with the set. }

También me interesaría si dicha optimización ya se realizó en tiempo de compilación (lo que significa que el código de bytes ya está optimizado) o si existen optimizaciones de tiempo de ejecución (realizadas por el compilador justo a tiempo) que esencialmente logran lo mismo.

Si un compilador no ve esto, la única opción parece instanciar el set fuera del ciclo para que sea óptimo:

 var set = Set.of("foo", "blah", "baz"); for (/* a loop that iterates quite often */) { // Do something with the set. }

Nota al margen, para aquellos que encuentran que el primer fragmento es una práctica bastante mala y que de todos modos lo escribirían como el segundo fragmento: este fragmento es en realidad una variante simplificada de mi caso de uso real, hecho por razones de simplicidad de la pregunta. El caso de uso real, un poco más complejo, que me llevó a esta pregunta es el siguiente, donde una cadena debe verificarse si es una de las pocas cadenas:

 for (/* a loop that iterates quite often */) { // ... var testString = // some String to check ... if (Set.of("foo", "blah", "baz").contains(testString)) { // Do something. } // ... }

Suponiendo que la condición if esté rodeada de código adicional (es decir, el cuerpo del bucle es bastante grande), creo que uno quiere declarar el conjunto en línea en lugar de más lejos fuera del bucle.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

La respuesta dependerá inevitablemente de las herramientas de Java que utilice.

El compilador de código de bytes javac es (deliberadamente) ingenuo, y no esperaría que hiciera ninguna optimización de esto. El compilador JIT de JVM puede optimizar esto, pero eso dependerá de:

  • su versión de Java,
  • el nivel del compilador JIT utilizado
  • qué /* do something with the set */ realmente implica.

Si esto realmente le importa, le recomendaría un par de enfoques.

  1. Vuelva a escribir el código usted mismo para sacar la declaración Set del bucle. En mi opinión, no hay nada fundamentalmente malo con este enfoque, aunque es potencialmente una optimización prematura. (Probablemente haría esto yo mismo en los ejemplos que diste. Simplemente "se siente bien" para mí).

  2. Utilice las opciones de JVM para descargar el código nativo producido por el compilador JIT y ver lo que realmente hace. Pero tenga en cuenta que los resultados pueden variar: consulte más arriba.

Pero incluso si sabe con un buen grado de certeza cómo funcionarán los compiladores, no está claro que deba preocuparse por esto en general .


Tenga en cuenta que mirar los bytecodes con javap -c le dirá si el compilador de java está optimizando. (O más probablemente, confirme que no lo es).

over 4 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 Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!