2012-06-06 30 views
6

Tengo un programa java que lee muchos datos de entrada de una base de datos, los manipula y luego escribe datos en otra base de datos (usando controladores ODBC, Excel y bases de datos de acceso, en una nueva máquina con Windows 7). El programa tarda unos 17 minutos en ejecutarse desde Eclipse, pero cuando creé un archivo .jar ejecutable, toma 10 minutos adicionales para ejecutarse (27 en total).¿Por qué mi archivo .jar se ejecuta más lento que el programa en eclipse?

Las dos razones que he encontrado hasta ahora para archivos jar lentos (al buscar SO y google) es que están comprimidos y que lleva mucho más tiempo escribir en el símbolo del sistema (o registro de errores) que consola en eclipse. Traté de crear un archivo jar sin comprimir y solo se aceleró unos 10 segundos (lo que podría haber sido completamente aleatorio, ya que los tiempos de ejecución varían en aproximadamente 30 segundos). Solo tengo unos 10 comandos System.out.println() en el programa, por lo que no debería ralentizarlo demasiado.

¿Alguna idea sobre qué está causando que se ejecute mucho más lento, y si hay alguna manera de acelerarlo? Avíseme si hay algún otro detalle que pueda ser relevante que deba incluir. ¡Gracias!

+2

¿Ha intentado eliminar por completo todos los comandos System.out.println()? La impresión en la consola consume mucha velocidad. –

+3

Sugiero usar la biblioteca logger o log4j para imprimir mensajes de registro y puede usar la marca de tiempo para ver qué parte de su código está creando el cuello de botella. Esta no es una solución concreta, pero debería ayudar a reducir el problema. – user845279

+0

De acuerdo con @Lai Xin Chu. Pero si es difícil eliminar todas las impresiones, simplemente ejecute su programa y redireccione STDOUT al archivo. No creo que la consola de Eclipse pueda funcionar más lento que el shell. – AlexR

Respuesta

4

Use JAMon. Es una biblioteca de monitoreo que le ayudará a medir los tiempos de ejecución de su código.

Después de agregar algún código de supervisión a sus métodos, ejecútelo en Eclipse y como un archivo JAR, y compare los resultados. Esto debería permitirle reducir la búsqueda.

También: Verifique si está ejecutando su archivo JAR con la misma versión java que utiliza el Eclipse (por ejemplo, Java 1.4.x puede ser mucho más lento que 1.6.x).

1

Puede verificar los parámetros de Java VM (como GC usado, memoria máxima, etc.). Para aplicaciones con uso intensivo de datos, GC podría desacelerar mucho las cosas.

2

En mi caso, mi aplicación tardó 3 segundos en ejecutarse en eclipse mientras que tardó 2 minutos cuando la ejecuté desde el contenedor.
Mi error fue elegir "Package required libraries into jar" al exportar mi proyecto en el tarro ejecutable.

He intentado varias formas de llevar hasta el momento, pero nada ayudó, excepto ..

Si usted tiene otras dependencias de Maven o archivos jar en su proyecto, se debe utilizar "**Extract required libraries into generated jar**" al exportar su proyecto en un frasco .

Esto resolvió mi problema en segundos & ahora mi eclipse & archivo jar está tardando el mismo tiempo para ejecutar la aplicación, 2 segundos.

Esperanza esto ayuda a los nuevos luchadores.

Atentamente.

+1

mismo aquí, corriendo en eclipse estaba bien (casi instantáneo), en el contenedor el proceso fue 4 minutos atrás. su sugerencia resolvió mi problema – benez

2

que tenía un problema similar. El shell estaba ejecutando órdenes de magnitud más lentas y no tenía nada que ver con la salida de la consola. Traté de establecer valores de memoria JVM pero no hizo ninguna diferencia

La solución fue empaquetar el archivo ANT con todos los archivos JAR en una carpeta externa, usando "Copiar bibliotecas requeridas en una subcarpeta al lado del generado Opción JAR "en el asistente" Exportar archivo JAR ejecutable ". Luego ejecute el JAR principal con una opción de línea de comando -cp [YOURSubFOLDER].

+0

¡Gracias por esto! Aparentemente eso también tiene un impacto enorme en la clase FXMLLoader de JavaFX, haciendo que funcione unas 10 veces más lento con un "contenedor lleno" y que aunque los archivos ya estaban desempaquetados ... – DragonGamer

+0

Mismo resultado aquí, también no lo hice necesita el '-cp', ya que el archivo de manifiesto ya especifica la ubicación de los sub-JAR – golimar

Cuestiones relacionadas