我注意到Java中最小控制台应用程序的启动时间在我的机器上略高于100毫秒,相当于1毫秒的等效C应用程序。虽然在大多数情况下这不是问题,但我想知道是否有办法减少这个时间,因为我需要编写一个将被执行多次的应用程序(比如在bash脚本中循环)。
答案 0 :(得分:2)
你要求Java的“阿喀琉斯之踵”。真的没什么关系。最后一个Java版本将是性能最高的,它们在that issue上工作多年。
无论如何多次运行相同的程序,你会发现在第一次启动后,下一个程序要快得多。我认为这来自操作系统缓存机制。
让它变得更好的唯一真正方法是让你的应用程序在后台运行并通过web服务与你的应用程序通信(这就是servlet容器的全部内容)。
100毫秒听起来不是太多,但在你的情况下可能是不可接受的。
答案 1 :(得分:2)
以下是我使用的解决方案的一些细节。
从这个简单的程序(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的想法),这导致执行时间仅为3毫秒:
$ javac HelloWorld.java
$ java HelloWorld &
$ time nc localhost 30281
Hello, world!
real 0m0.003s
user 0m0.000s
sys 0m0.000s
答案 2 :(得分:2)
使用GCJ将代码编译为本机代码。会有所帮助,但不要期望太多。
答案 3 :(得分:1)
也许java不是这项工作的最佳工具?出于性能原因使用客户端 - 服务器方法似乎是一个非常糟糕的主意。您引入了额外的复杂性和失败点。如果已经服务器崩溃或tcp端口等怎么办?