seticonimage seticon programacion icon change app java performance console startup

programacion - seticon java netbeans



¿Hay alguna forma de reducir el tiempo de inicio de una aplicación Java de consola? (4)

Estás 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 trabajando durante años en ese tema .

De todos modos, ejecutando 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 forma real de hacerlo mejor es dejar correr su aplicación en segundo plano y comunicarse con su aplicación, tal vez 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.

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).


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


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.?


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

A partir de este programa trivial (HelloWorld.java) que tardó aproximadamente 100ms en ejecutarse:

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

Lo convertí 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(); } } }

Empieza una vez y usa netcat para conectarte (gracias PeterMmm por la idea) que resultó en un 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