2010-10-26 15 views
6

Noté que el tiempo de inicio de una aplicación de consola mínima en Java es ligeramente superior a 100 ms en mi máquina en comparación con 1 ms de una aplicación C equivalente. Aunque no es un problema en la mayoría de los casos, me gustaría saber si hay una forma de reducir este tiempo porque necesito escribir una aplicación que se ejecutará muchas veces (por ejemplo, en un bucle dentro de un script bash).¿Hay alguna forma de reducir el tiempo de inicio de una aplicación Java de consola?

+0

duplicado de http://stackoverflow.com/questions/1316056/how-to-reduce-scala-java-startup-overhead - asegúrese de utilizar '-client' – sfussenegger

+0

Gracias por el enlace. Desafortunadamente, el cliente no reduce el tiempo de inicio en mi máquina. – vitaut

Respuesta

2

Está pidiendo el "talón de Aquiles" de Java. Realmente no hay mucho que ver con eso. La última versión de Java será la más eficiente, están funcionando durante años en that issue.

De todos modos, si ejecuta el mismo programa varias veces, notará que después del primer inicio, el siguiente es mucho más rápido. Creo que eso proviene del mecanismo de caché del sistema operativo.

La única manera real de hacerlo mejor es dejar correr su aplicación en segundo plano y comunicarse con su aplicación quizás a través de un servicio web (de eso se trata el contenedor de servelet).

100 ms no suena demasiado, pero podría ser inaceptable en su caso.

+0

Lamentablemente, Java Quick Starter solo se aplica a Windows. – vitaut

+0

De hecho, el tiempo de inicio mejora para las ejecuciones posteriores, pero 100 ms es un tiempo mejorado. Estaba pensando en comenzar algún tipo de proceso en segundo plano en la primera ejecución y usarlo en las últimas ejecuciones, pero aún no estoy seguro de cómo hacerlo. – vitaut

+1

Puede escribir una aplicación que escuche en un socket TCP, reciba algunos comandos y obtenga el resultado como texto sin formato. Conéctese al zócalo con netcat de su secuencia de comandos. Eso es todo (¡casi!). – PeterMmm

2

Aquí hay algunos detalles sobre la solución que utilicé.

A partir de este programa trivial (HelloWorld.java) que se llevó a unos 100 ms para ejecutar:

class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello, world!"); 
    } 
} 

$ javac HelloWorld.java 
$ time java HelloWorld 
Hello, world! 

real 0m0.109s 
user 0m0.030s 
sys  0m0.030s 

que lo convirtieron en un servidor trivial:

import java.io.*; 
import java.net.*; 

class HelloWorldThread extends Thread { 
    private Socket socket; 

    public HelloWorldThread(Socket s) { 
     super("HelloWorldThread"); 
     socket = s; 
    } 

    public void run() { 
     try { 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      out.println("Hello, world!"); 
      out.close(); 
      socket.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class HelloWorld { 
    public static void main(String[] args) { 
     try { 
      ServerSocket serverSocket = new ServerSocket(30281); 
      while (true) 
       new HelloWorldThread(serverSocket.accept()).start(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

empezar una vez y usar a netcat conectarse a él (gracias PeterMmm por la idea) que resultó en el tiempo de ejecución de solo 3ms:

$ javac HelloWorld.java 
$ java HelloWorld & 
$ time nc localhost 30281 
Hello, world! 

real 0m0.003s 
user 0m0.000s 
sys  0m0.000s 
1

Compila tu código con código nativo usando GCJ. Te ayudará un poco, pero no esperes demasiado.

+0

+1 porque da 2.5 veces más velocidad. Sin embargo, todavía demora 40 ms, es ~ 10 veces más lento que la solución de netcat. – vitaut

1

Y tal vez Java no es la mejor herramienta para el trabajo? Usar el enfoque cliente-servidor solo por razones de rendimiento me parece una muy mala idea. Introduce complejidad adicional y puntos de falla. ¿Qué pasa si el servidor se bloquea o el puerto tcp ya está ocupado, etc.?

+0

Si pudiera usar un idioma diferente, no haría esta pregunta. Java es un requisito. Pero tiene razón, existe una complejidad adicional, aunque me sorprendió lo fácil que fue implementar el servidor en Java. – vitaut

+0

Si no se puede cambiar el idioma, sugeriría usar una tubería con nombre inscription de socket tcp. Es una solución más simple y confiable. –

Cuestiones relacionadas