我注意到在我的机器上,Java最小控制台应用程序的启动时间略高于100毫秒,而等效的C应用程序只需要1毫秒。虽然在大多数情况下这不是问题,但我想找出是否有一种方法可以减少这个时间,因为我需要编写一个将被执行多次的应用程序(比如在bash脚本循环内)。
我注意到在我的机器上,Java最小控制台应用程序的启动时间略高于100毫秒,而等效的C应用程序只需要1毫秒。虽然在大多数情况下这不是问题,但我想找出是否有一种方法可以减少这个时间,因为我需要编写一个将被执行多次的应用程序(比如在bash脚本循环内)。
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
使用GCJ将您的代码编译为本地代码。这会有所帮助,但不要期望太多。
也许Java并不是最适合这项工作的工具?仅出于性能原因而使用客户端-服务器方法似乎是一个非常糟糕的想法。您会引入额外的复杂性和故障点。如果服务器崩溃或TCP端口已被占用,怎么办?
-client
。以下是有关编程的内容:如何减少Scala/Java启动开销 - sfussenegger