2

Java の妥当な (目立たない) 開始時間を取得する方法はありますか?


この問題のデモンストレーションとして、Macbook Pro で Java と JavaScript (node.js を使用して実行) で単純な Hello World プログラムを実行します。

$ time java T
Hello world!

real    0m0.352s
user    0m0.301s
sys 0m0.053s

$ time node T.js
Hello world!

real    0m0.098s
user    0m0.079s
sys 0m0.013s

Node.js ではそうではありませんが、Java バージョンでは顕著な遅延があります。これにより、コマンド ライン ツールが応答していないように見えます。(これは、上記の単純な例とは異なり、複数のクラスに依存している場合に特に当てはまりますT.java

4

5 に答える 5

3

おそらく、あなたが試すことができる唯一のことは、JVM の別の実装ですが、それはおそらく変わらないでしょう。ほとんどの Java アプリは (比較的) 寿命が長く、対話型である可能性があります。つまり、JVM の起動時間が通常の使用の騒音の中で失われます。

于 2012-05-16T22:31:09.730 に答える
1

まだ試していませんが、nailgun を見る価値があるかもしれません。同じ JVM で Java プログラムを実行するため、「ウォームアップ」後はかなり高速になるはずです。「Hello World」の例では、0.132 秒から 0.004 秒かかります

http://www.martiansoftware.com/nailgun/background.html

于 2013-03-31T19:53:56.130 に答える
1

しかし、Java コマンドライン アプリを繰り返し呼び出すタイミングを実際に計ってみたことがありますか? ライブラリ クラスがファイル システム キャッシュにあることで、起動時間が最初の化身の後にいくらか軽減されると思います。

そうは言っても、Java プラットフォームは最も単純なものの 1 つではなく、いずれにせよ、小さなネイティブ実行可能ファイルと競合するつもりはありません。

編集:上記のタイミングは「ウォームアップ」コール用であると言うように、可能な回避策は次のとおりです。

  • コマンドのガビンをJavaで書く
  • コマンドを受け取って関連する Java ルーチンに渡す単純なローカルで継続的に実行される「サーバー」を作成します。
  • Java サーバーにコマンドを渡し、結果を吐き出すことが唯一の目的である単純なネイティブ コマンドライン ラッパーを作成します (または、起動が高速なもので作成します)。

これは良くありませんが、呼び出しのコマンドラインモデルを維持しながら、ルーチンのガビンをJavaで書くことができます(これは本質的にあなたが望むものだと思います)。

于 2012-05-16T22:37:02.390 に答える
1

他の人が言ったように、単純な答えは「そうではない」だけです。パフォーマンスを少し改善することはできますが、VM が起動して動き出すまでに時間がかかるという事実から逃れることはできません。

このようなアプリ用にサーバー VM が選択されていないことを確認してください。これは、起動時間が実際に長くなる原因の 1 つです。

これを回避する唯一の現実的な方法は、GCJ を使用して Java をネイティブ コードにコンパイルすることです。したがって、これらのアプリを Java で作成する必要があり、それらをより高速に作成する必要がある場合は、見下す道かもしれません。ただし、最新の状態ではなく、メンテナンスもほとんど終了しているように見えることを覚えておいてください.

于 2012-05-16T22:51:55.930 に答える