Есть ли способ сократить время запуска консольного Java-приложения? - PullRequest
7 голосов
/ 26 октября 2010

Я заметил, что время запуска минимального консольного приложения в Java на моей машине составляет чуть более 100 мс по сравнению с 1 мс эквивалентного приложения на Си.Хотя в большинстве случаев это не проблема, я хотел бы узнать, есть ли способ сократить это время, потому что мне нужно написать приложение, которое будет выполняться много раз (скажем, в цикле внутри скрипта bash).

Ответы [ 4 ]

2 голосов
/ 27 октября 2010

Итак, вот некоторые подробности о решении, которое я использовал.

Начиная с этой тривиальной программы (HelloWorld.java), выполнение которой заняло около 100 мс:

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 голосов
/ 27 октября 2010

Скомпилируйте ваш код в собственный код, используя GCJ Поможет немного, но не ожидайте слишком многого.

2 голосов
/ 26 октября 2010

Вы просите "ахиллесову пяту" Java. С этим действительно мало что можно сделать. Последняя версия Java будет самой производительной, они годами работают над , который выдает .

В любом случае, при запуске одной и той же программы несколько раз, вы заметите, что после первого запуска следующий будет намного быстрее. Я думаю, что это происходит от механизма кэширования ОС.

Единственный реальный способ сделать его лучше - это позволить вашему приложению работать в фоновом режиме и общаться с вашим приложением, возможно, через веб-сервис (вот что представляет собой контейнер сервлета)

100 мс звучит не слишком много, но может быть неприемлемо в вашем случае.

1 голос
/ 27 октября 2010

А может ява не самый лучший инструмент для работы? Использование клиент-серверного подхода только по соображениям производительности кажется мне очень плохой идеей. Вы вводите дополнительные сложности и точки отказа. Что делать, если сервер выходит из строя или порт TCP уже занят?

...