12

何らかの処理を行い、ユーザーにフィードバックを提供するメッセージを表示する必要がある Java アプリケーションを作成しています。

ただし、非常に遅いようで、戻るのに 2 秒以上かかります。

ソースから明らかな原因を取り除きました。使用したコードは次のとおりです。

package SwingPlay;

import javax.swing.JFrame;

public class Dialog
{

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "DialogDemo" );
    }

}

コマンドラインからこれを実行しています:

java -classpath . SwingPlay.Dialog

ご覧のとおり、JFrame を作成するだけで、表示すらしていません。

関連する場合、ここに私のjava -version出力があります:

java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)

これは (現在) Win XP SP2 に対して実行されています。


では、最初の質問: なぜそんなに遅いのですか?

さらに重要なことは、単純なメッセージ (cmdline ではなく GUI) を遅滞なく表示したいということです。


アップデート:

少し背景が役立つかもしれません:
私は多くの「ヘッド」を持つアプリケーションを作成しています (つまり、複雑な部分を実行するために同じコア クラスを使用するさまざまなユーザー インターフェイス)。
私は現在、正常に動作する純粋なコマンド ライン ヘッドを持っています - すぐに応答します。
また、通常のポイント & クリック GUI を備えた標準アプリケーションも用意するつもりですが、このビットに問題があるとは考えていません。
私が現在取り組んでいるのは、これら 2 つのハイブリッドです。実行ボックス (または同様のランチャー) から、おそらく引数を使用して起動され、事実上、ステータス メッセージで応答するだけで済みます。キーを押します。

この後者は、問題が焦点を合わせているところです。

私はシェルスクリプトで既存のコマンドラインバージョンを使用することに反対していませんが(必要だとは思いませんでした!)、既存の回答は、物事が他の人ほど速く実行されていないことを示唆しているようです-1私の例では、70ms に対して 1460ms かかります。これは大きな違いです。

4

10 に答える 10

11

Java はインタープリター言語であり、新しい JVM (インタープリター) の起動に時間がかかるため、遅延の理由

実際、フレームの作成には数ミリ秒もかかりません (私のマシンでは約 70 ミリ秒)。

これが Java アプリ内で使用される場合は、心配する必要はありません。ほとんど瞬時に実行されます (これには JDialog または JOptionPane を使用する必要があります)。

これがJavaアプリ内で使用されず、2秒が多すぎる場合(そして私は多すぎると思います)、その仕事のために別のツールを検討する必要があります.

コードで時間を測定する方法は次のとおりです。

import javax.swing.JFrame;

public class Dialog {

    public static void main( String[] args ) {
        long start = System.currentTimeMillis();
        JFrame frame = new JFrame( "DialogDemo" );
        System.out.println( "Took: " + (  System.currentTimeMillis() - start   ) );
    }

}
于 2009-02-03T21:03:25.757 に答える
4

JOptionPaneを使用してメッセージを表示します。簡単な例を次に示します。

import javax.swing.*;

public class OptionDemo {
    public static void main(String[] args) throws Exception {
        JOptionPane.showMessageDialog(null, "Hello World");
    }
}

残念ながら、あなたが経験している遅延について説明することはできません. 私のシステムでは、コード スニペットは 500 ミリ秒で実行されます。

于 2009-02-03T20:36:54.467 に答える
3

Java はこれには不適切なツールです。JVM のセットアップには、Java コードの最初の行が実行される前に、バックグラウンドで多くの処理が行われます。これを回避する方法は実際にはありません。

于 2009-02-03T20:47:50.887 に答える
2

メッセージボックスを表示するためにJavaを使用する必要がありますか?ボックスがアプリケーションの外部から来ている場合は、他の何かを使用してダイアログを生成することをお勧めします。

コマンドライン文字列からメッセージボックスを表示するだけのネイティブWindowsアプリを作成するには、せいぜい数時間しかかかりません。一般的なスクリプト言語のほとんどには、それを行う方法もあるはずです。これは、コマンドラインを介したjavascriptを介したある人の例です。

http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html

于 2009-02-03T23:57:25.827 に答える
2

また、 JFrameの代わりにAWT Window (またはFrame )を作成する方がはるかに高速です。なぜなら、後者は無数の追加のクラス ファイルを取り込まなければならないからです。

于 2009-02-03T20:24:06.583 に答える
1

これを高速化することに興味があり、オーバーヘッドのほとんどが JVM 起動のオーバーヘッドであるように思われるので、JVM を常にバックグラウンドで実行し続けることで遅い JVM 起動に対処することを目的としたNailgunを調べてください。あなたの場合、1回実行した後、Swingライブラリもキャッシュされてしまい(さらに数回実行するとJITも行われることを願っています)、オーバーヘッドがさらに削減されます。

ただし、この方法では、バックグラウンド JVM が原因でメモリ使用量が増加し、シャットダウンするタイミングを判断するのが簡単ではないため、他の問題も発生します。

于 2013-06-28T21:14:37.650 に答える
1

ああ、本当に Java からダイアログを表示する必要がない場合は、KDialog (または GNOME の対応物) または同様のものを使用して調べることができます。

于 2009-02-03T20:26:21.400 に答える
1

JOptionDialog を使用できます

JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);
于 2009-02-03T20:37:14.950 に答える
0

おそらくあなたが探しているのは、Java 6 の新しい SplashScreen 機能です。JVM がロードされるのを待つ代わりに (VM をロードするには常にコストがかかります)、事前に画面をロードします。

于 2009-02-03T20:12:53.813 に答える
0

NetBeansなどのプロファイラーで実行してみましたか? 標準ライブラリの奥深くにボトルネックがある場合は、それを見つける良い方法です。

于 2009-02-03T21:49:18.423 に答える