我注意到,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. 是否有減少nrepl(ritz-repl)啓動時間的方法?
- 5. 如何減少IONIC 2應用程序的啓動時間?
- 6. 如何減少Spring MVC應用程序的冷啓動時間?
- 7. 如何減少典型iPhone應用程序的啓動時間?
- 8. 如何在啓動時啓動控制檯應用程序(!)? C#
- 9. 從控制檯應用程序啓動控制檯應用程序
- 10. 在離子-2應用程序中減少啓動時間
- 11. 如何從Eclipse啓動應用程序時啓動java控制檯?
- 12. 控制檯應用程序隨着時間推移減慢
- 13. 控制檯應用程序沒有參數時,默認方法不執行
- 14. 減少應用程序構建/調試時間的方法
- 15. 有沒有辦法從Java程序隱藏win32啓動控制檯(如果可能,沒有JNI)
- 16. 隱藏控制檯應用程序的控制檯(完全),但有時只有
- 17. 有沒有基準測試Java程序啓動的方法?
- 18. iTunes啓動時沒有後臺進程(如last.fm)啓動Mac應用程序
- 19. 從控制檯運行時自動啓動Play2應用程序
- 20. 重新啓動一個java控制檯應用程序代碼
- 21. 重新啓動Java控制檯應用程序
- 22. 減少Java EE Web應用程序的響應時間
- 23. 簡單的Visual Studio控制檯應用程序無法啓動
- 24. 從不同的應用程序啓動時,C#控制檯應用程序不顯示控制檯輸出
- 25. 無法使用xCode 4.4啓動控制檯應用程序
- 26. 引用的Java包沒有複製到控制檯應用程序
- 27. 爲什麼我的控制檯應用程序沒有顯示控制檯
- 28. 控制檯應用程序ILMerged後沒有更多的控制檯
- 29. 有沒有一種簡單的方法在啓動過程中向啓動控制檯寫入內容?
- 30. 控制檯在啓動時啓動控制檯應用程序時不會打開VB.NET
重複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