有没有办法减少控制台Java应用程序的启动时间?

时间:2010-10-26 07:34:54

标签: java performance console startup

我注意到Java中最小控制台应用程序的启动时间在我的机器上略高于100毫秒,相当于1毫秒的等效C应用程序。虽然在大多数情况下这不是问题,但我想知道是否有办法减少这个时间,因为我需要编写一个将被执行多次的应用程序(比如在bash脚本中循环)。

4 个答案:

答案 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端口等怎么办?