我注意到,Java中的最小控制檯應用程序的啓動時間比我的機器上的稍微多於100毫秒,而相當於1毫秒的等效C應用程序。雖然在大多數情況下它不是問題,但我想知道是否有辦法縮短這個時間,因爲我需要編寫一個將被執行多次的應用程序(比如在bash腳本中的循環中)。有沒有減少控制檯Java應用程序啓動時間的方法?
回答
您要求Java的「致命弱點」。與它沒有太大關係。最後的Java版本將是最高性能的,他們在that issue上工作多年。
無論如何多次運行相同的程序,你會注意到第一次啓動後下一個更快。我認爲這來自操作系統緩存機制。
使其更好的唯一真正方法是讓後臺運行您的應用程序,並與您的應用程序通過web服務(這是servelet容器的全部內容)進行交流。
100ms不會聽起來太多,但在您的情況下可能無法接受。
所以這裏是關於我使用的解決方案的一些細節。
從這個簡單的程序(HelloWorld.java)歷時100ms左右執行開始:
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
我將它轉換成一個簡單的服務器:
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();
}
}
}
一旦啓動它,並使用netcat來連接到它(感謝PeterMmm的想法),導致執行時間只有3ms:
$ javac HelloWorld.java
$ java HelloWorld &
$ time nc localhost 30281
Hello, world!
real 0m0.003s
user 0m0.000s
sys 0m0.000s
也許java不是工作的最佳工具?使用客戶端 - 服務器方法僅僅是出於性能方面的原因,在我看來,似乎是一個非常糟糕的主意你會引入更多的複雜性和失敗點。如果服務器崩潰或TCP端口已被佔用等,該怎麼辦?
如果我可以使用不同的語言,我不會問這個問題。 Java是一項要求。但是你是對的,雖然我很驚訝在Java中實現服務器是多麼容易,但還是有額外的複雜性。 – vitaut 2010-10-27 06:41:42
如果語言無法更改,我會建議使用命名管道insted tcp套接字。這是更簡單,更可靠的解決方案。 – 2010-10-28 16:47:32
- 1. .Net無法啓動控制檯的控制檯應用程序
- 2. 啓動應用程序,並沒有看到控制檯
- 3. 有沒有辦法從WinForms/WPF應用程序啓動/打開控制檯?
- 4. 如何減少典型iPhone應用程序的啓動時間?
- 5. 如何減少IONIC 2應用程序的啓動時間?
- 6. 如何減少Spring MVC應用程序的冷啓動時間?
- 7. 在離子-2應用程序中減少啓動時間
- 8. 如何從Eclipse啓動應用程序時啓動java控制檯?
- 9. 控制檯應用程序隨着時間推移減慢
- 10. 減少應用程序構建/調試時間的方法
- 11. 有沒有辦法從Java程序隱藏win32啓動控制檯(如果可能,沒有JNI)
- 12. iTunes啓動時沒有後臺進程(如last.fm)啓動Mac應用程序
- 13. 重新啓動一個java控制檯應用程序代碼
- 14. 重新啓動Java控制檯應用程序
- 15. 簡單的Visual Studio控制檯應用程序無法啓動
- 16. 無法使用xCode 4.4啓動控制檯應用程序
- 17. 在後臺啓動我的控制檯應用程序
- 18. 添加清單後無法啓動控制檯應用程序
- 19. 如何在iPhone中啓動應用程序後減少主控制器的使用時間
- 20. 在應用程序啓動時最小化控制檯C#
- 21. 應用程序啓動時沒有啓動活動
- 22. 啓用Java控制檯應用程序的JMX bean的Web
- 23. 單控制檯應用程序:Winforms方法拋出異常Linux上沒有X
- 24. 控制檯程序在發送\ n到stdin時沒有反應
- 25. 顯示啓動的Java應用程序的控制檯的Java ProcessBuilder?
- 26. 如何調用主要方法或重新啓動應用程序控制臺?
- 27. 啓動後臺Win32控制檯應用程序
- 28. 如何減少.net應用程序中的啓動和運行時間?
- 29. 減少iphone應用二進制大小的有用方法
- 30. 有沒有辦法將我的控制檯應用程序轉換爲C#中的Windows窗體應用程序?
重複http://stackoverflow.com/questions/1316056/how-to-reduce-scala-java-startup-overhead-確保使用'-client' – sfussenegger 2010-10-27 22:10:43
感謝您的鏈接。不幸的是,客戶端根本不能縮短我的機器的啓動時間。 – vitaut 2010-10-28 06:25:28