代码之家  ›  专栏  ›  技术社区  ›  vitaut

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

  •  7
  • vitaut  · 技术社区  · 14 年前

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   PeterMmm    14 年前

    你要的是Java的“阿基里斯之踵”。真的没什么关系。上一个Java版本将是性能最好的,他们已经在上面工作了很多年了 that issue .

    不管怎样,运行同一个程序几次,你会发现在第一次启动之后,下一次启动要快得多。我认为这来自操作系统缓存机制。

    唯一让它变得更好的方法是让你的应用在后台运行,并通过一个web服务与你的应用进行通信(这就是servelet容器的全部功能)。

    100毫秒听起来不算太多,但对你来说可能是不可接受的。

        2
  •  3
  •   Community CDub    8 年前

    下面是一些我使用的解决方案的细节。

    从这个花费大约100毫秒来执行的琐碎程序(HelloWorld.java)开始:

    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

    $ javac HelloWorld.java
    $ java HelloWorld &
    $ time nc localhost 30281
    Hello, world!
    
    real    0m0.003s
    user    0m0.000s
    sys     0m0.000s
    
        3
  •  2
  •   Steve-o    14 年前

    使用 GCJ

        4
  •  1
  •   Jacek Ławrynowicz    14 年前

    也许java不是最好的工具?在我看来,仅仅出于性能原因而使用客户机-服务器方法是一个非常糟糕的主意。你引入了额外的复杂性和失败点。如果服务器崩溃或tcp端口已被占用等怎么办?

    推荐文章