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?
Respuesta
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.
Lamentablemente, Java Quick Starter solo se aplica a Windows. – vitaut
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
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
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
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.?
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
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. –
- 1. ¿Hay alguna forma de reducir el malloc/libre de ostringstream?
- 2. ¿Hay alguna forma de reducir la precisión scipy/numpy para reducir el consumo de memoria?
- 3. Cómo reducir el tiempo de inicio de una aplicación típica de iPhone?
- 4. ¿Hay una implementación Java de tipo 'reducir'?
- 5. ¿Hay alguna forma de modularizar una aplicación JavaFX?
- 6. ¿Hay alguna forma de reducir el tiempo de arranque de Android Emulator proporcionado con SDK de Android
- 7. Cómo reducir la sobrecarga de inicio de Scala (/ Java)?
- 8. ¿Hay alguna aplicación de kernel/escritorio Java?
- 9. ¿Hay alguna forma de distinguir entre una actividad de Android onResume desde la pantalla de inicio?
- 10. ¿Hay alguna forma de pasar una anotación Java como parámetro?
- 11. ¿Hay alguna forma de detectar el inicio de una descarga en JavaScript?
- 12. ¿Hay alguna forma de compilar código Java en una DLL?
- 13. ¿Hay alguna manera de imprimir en la consola en una aplicación de Android?
- 14. ¿Alguna forma de aumentar la velocidad de inicio de JVM?
- 15. ¿Hay alguna forma de pasar el iPhone?
- 16. ¿Hay alguna forma de aumentar/reducir una imagen al desplazarse con Jquery?
- 17. ¿Hay alguna forma de mostrar el tiempo de compilación de una solución completa en Visual Studio?
- 18. ¿Hay alguna forma de determinar si Java System.in es "interactivo"?
- 19. Cómo reducir el uso de memoria de una aplicación WPF
- 20. Mejorar el tiempo percibido de inicio de la aplicación WPF
- 21. ¿Hay alguna forma de 'resaltar' el código?
- 22. ¿Hay alguna manera de enviar el tipo de datos java a la consola?
- 23. ¿Hay alguna forma de obtener una dirección de referencia?
- 24. ¿Cómo puedo reducir el tiempo de inicio del script Perl CGI?
- 25. ¿Hay alguna forma de configurar el "tiempo de espera de inactividad" del grupo de aplicaciones en web.config?
- 26. ¿Hay alguna forma de actualizar automáticamente la aplicación en Android?
- 27. ¿Hay alguna forma de cambiar el nombre de una aplicación ClickOnce desplegada?
- 28. ¿Hay alguna consola interactiva similar a Python para Java?
- 29. ¿Hay alguna biblioteca de "gráficos" de consola para .Net?
- 30. ¿Hay alguna manera de ocultar la consola de inicio win32 desde un programa Java (si es posible sin JNI)?
duplicado de http://stackoverflow.com/questions/1316056/how-to-reduce-scala-java-startup-overhead - asegúrese de utilizar '-client' – sfussenegger
Gracias por el enlace. Desafortunadamente, el cliente no reduce el tiempo de inicio en mi máquina. – vitaut