por qué la ejecución paralela en java compile toma crecimiento lineal en el tiempo


time javac Main.java                                      --> 0m1.050s
time javac Main.java & javac Main.java                    --> 0m1.808s
time javac Main.java & javac Main.java & javac Main.java  --> 0m2.690s
time javac Main.java & ... 8 time                         --> 0m8.309s

Cuando ejecutamos javac el comando en paralelo y con cada aumento en javac el comando ~1 sec se agrega para que todo el comando javac se complete.

¿Por qué hay un crecimiento lineal es el tiempo ?

Es todo javac proceso mientras se ejecuta involucrado en algún tipo en locks, si es así, cómo superarlo para no tener un crecimiento lineal en el tiempo


PS: He intentado arriba en single core machine, double core machine, 4 core machine todos mostraron el mismo comportamiento.

PS2: medio ambiente RedHat7, javac 1.7.0_79

Author: Bhuvan, 2015-06-06

1 answers

El compilador java ya se encarga de dividir su trabajo entre los procesadores disponibles, incluso cuando solo compila un solo archivo. Por lo tanto, ejecutar instancias de compilador separadas en paralelo no producirá las ganancias de rendimiento que espera.

Para demostrar esto, generé un programa java grande (1 millón de líneas, 10,000 métodos) en un solo archivo llamado Main1.java. Luego hizo copias adicionales como Main2.java hasta Main8.java. Los tiempos de compilación son los siguientes:

Archivo único compile:

time javac Main1.java &    --> (real) 11.6 sec

Ver este único archivo compilar en top reveló el uso del procesador principalmente en el rango de 200-400% (lo que indica el uso de múltiples CPU, 100% por CPU), con picos ocasionales en el rango de 700% (el máximo en esta máquina es de 800% ya que hay 8 procesadores).

A continuación, dos archivos simultáneamente:

time javac Main1.java &    --> (real) 14.5 sec
time javac Main2.java &    --> (real) 14.8 sec

Así que solo tomó 14.8 segundos compilar dos, cuando tomó 11.6 segundos compilar uno. Eso es definitivamente no lineal. Estaba claro mirando top mientras estos se estaban ejecutando que de nuevo cada compilador de Java solo estaba aprovechando como máximo cuatro CPU a la vez (con picos ocasionales más altos). Debido a esto, los dos compiladores corrieron a través de ocho CPU en su mayoría en paralelo entre sí.

A continuación, cuatro archivos simultáneamente:

time javac Main1.java &    --> (real) 24.2 sec
time javac Main2.java &    --> (real) 24.6 sec
time javac Main3.java &    --> (real) 25.0 sec
time javac Main4.java &    --> (real) 25.0 sec

Bien, aquí hemos chocado contra la pared. Ya no podemos superar-paralelizar el compilador. Cuatro archivos tardaron 25 segundos, mientras que dos tardaron 14.8. Hay un poco de optimización allí, pero es sobre todo un tiempo lineal aumentar.

Finalmente, ocho simultáneamente:

time javac Main1.java &    --> (real) 51.9 sec
time javac Main2.java &    --> (real) 52.3 sec
time javac Main3.java &    --> (real) 52.5 sec
time javac Main4.java &    --> (real) 53.0 sec
time javac Main5.java &    --> (real) 53.4 sec
time javac Main6.java &    --> (real) 53.5 sec
time javac Main7.java &    --> (real) 53.6 sec
time javac Main8.java &    --> (real) 54.6 sec

Esto fue en realidad un poco peor que lineal, ya que ocho tomaron 54.6 segundos mientras que cuatro solo tomaron 25.0.

Así que creo que la conclusión de todo esto es tener fe en que el compilador hará un trabajo decente tratando de optimizar el trabajo que le das a través de los recursos disponibles de la CPU, y que tratar de agregar paralelización adicional a mano tendrá un beneficio limitado (si lo hay).

Editar:

Para referencia, hay dos entradas que encontré en la base de datos de errores de Oracle con respecto a la mejora de javac para aprovechar múltiples procesadores:

  • ID de error: JDK-6629150 The La queja original, esto fue finalmente marcado como un duplicado de:
  • Bug ID: JDK-6713663 Suggests Sugiere la resolución, y basado en la "Fecha de resolución" parece que el soporte multiprocesador en javac fue agregado el 2008-06-12.
 27
Author: Kevin Hoffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-23 13:22:42