2010-09-16 24 views
26

Uso un escritorio con ocho núcleos para compilar una aplicación Java utilizando Ant (a través de un destino javac). ¿Hay alguna manera de acelerar la compilación usando más de un hilo o proceso?Uso de múltiples núcleos/procesadores al compilar Java

Sé que puedo ejecutar varias tareas Ant en paralelo, pero no creo que esto se pueda aplicar a un único objetivo de compilación, ¿o no?

+2

ver pregunta relacionada aquí: http://stackoverflow.com/questions/523575/is-there-a-way-to-improve-multicore-multiprocessor-performance-of-the-java-com – Elijah

Respuesta

17

No conozco ninguna forma de hacer que la hormiga misma haga un uso efectivo de múltiples núcleos. Pero you can tell ant to use the Eclipse Compiler, que tiene soporte para multithreaded compilation incorporado.

+0

Aquí hay una buen artículo de blog sobre [Ejecutando el compilador Eclipse Java con Ant] (http://owenou.com/2009/11/18/running-eclipse-java-compiler-with-ant.html). – sschuberth

+1

Uso de Intellij 2017.1.3 con JDK 1.8 javac termina siendo más rápido que el compilador de eclipse en ambas instancias: versiones paralelas activadas y apagadas. Con eso, nuestro proyecto tarda ~ 23 segundos para una reconstrucción con Javac y ~ 27 segundos para una reconstrucción con eclipse copmiler - extraño, ya que es un procesador i7 de 4 núcleos. – Volksman

1

The documentation parece indicar que es poco probable que funcione correctamente con javac.

Cualquiera que trate de ejecutar grandes secuencias de tareas Ant en paralelo, como javadoc y javac, al mismo tiempo, está implícitamente asumiendo la tarea de identificar y corregir todos los errores de concurrencia de las tareas que se ejecutan.

En consecuencia, si bien esta tarea tiene usos, debe considerarse una tarea avanzada que debe usarse en determinadas situaciones de procesamiento por lotes o pruebas, en lugar de un truco fácil para acelerar los tiempos de compilación en una CPU de múltiples vías.

+0

upvote, también del documento: 'Las tareas de terceros pueden ser o no seguras para hilos, y algunas de las tareas principales de Ant, como , definitivamente no son reentrantes. – VolkerK

2

Mientras el javac que está llamando no utiliza todos los núcleos que en realidad no importa lo que diga en hormiga. Puede usar el atributo compiler para definir qué compilador Java se debe usar para la tarea.

Si tiene varios objetivos de compilación, puede usar fork=yes para ejecutar el objetivo (s) externamente.

http://ant.apache.org/manual/Tasks/javac.html#compilervalues

+3

+1. Solo quiero agregar que actualmente 'javac' tiene un único subproceso (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6629150) y que no es una tarea trivial hacerlo de subprocesos múltiples (http : //blogs.sun.com/jjg/entry/towards_a_multi_threaded_javac). –

0

No es por lo que yo sé. El compilador de Eclipse ha trabajado un poco para acelerar el uso de varios núcleos, pero no compra tanto como a usted le gustaría.

La pregunta es, ¿puede vivir con la compilación incremental para el desarrollo, y solo recompilar los que cambiaron? La reconstrucción completa se puede dejar en el servidor de compilación.

0

Puede usar Buck Build para aumentar su velocidad de construcción y utilizar varios núcleos.

En pocas palabras:

Buck es un sistema de construcción desarrollado y utilizado por Facebook. Se alienta a la creación de pequeños módulos reutilizables que constan de código y recursos , y es compatible con una variedad de idiomas en muchas plataformas.

Buck construye artefactos independientes en paralelo para aprovechar múltiples núcleos en su máquina. Además, reduce los tiempos de compilación incrementales en manteniendo un registro de los módulos sin cambios de modo que se reconstruya el conjunto mínimo de módulos .

Cuestiones relacionadas