1

イベントディスパッチスレッドの「ビジー」を測定したいと思います。考えられるアイデアの1つは、次のようなことを行うバックグラウンドスレッドを設定することです。

while(true) {
    final long[] end = new long[1]; // Array to get stuff out from Runnable.
    long start = System.nanoTime();
    EventQueue.invokeAndWait(new Runnable() {
        public void run() {
            end[0] = System.nanoTime(); 
        }
    });
    long queueTimeNs = end[0] - start;
    // Report the queue time somewhere.
    Thread.sleep(100); // Poll the EDT < 10 times/s.
}

アイデアは、イベントをEDTに送信してからディスパッチされるまでにかかる時間を測定することです。これにより、UIの応答性について大まかなアイデアが得られます。

これは意味がありますか?同様のことを行うためのより標準的な方法はありますか?

4

2 に答える 2

2

私はこれに優れたツールを使用しています:SwingExplorer。これにより、Swingコンポーネントを検査し、それらがどのように描画されるかを確認し、EDT違反を検出し、EDTのハングを検出することができます。基本的に、期間の値をミリ秒単位で入力してから、アプリで遊んでいます。EDTがこの期間を超えてハングすると、ハングはツールのUIに記録されます。

公式サイトはhttps://swingexplorer.dev.java.netですが、この回答を書いている時点ではダウンしているようです。EclipseとNetBeansのプラグインを見つけることができます。また、Mavenを使用している場合は、Mavenリポジトリでswingexplorerを見つけることもできます(申し訳ありませんが、現時点ではリンクが見つかりません)

少なくともリポジトリはまだ利用可能です:cvs -d :pserver:guest:guest@cvs.dev.java.net:/shared/data/ccvs/repository co swingexplorer

編集

EventQueueSwing Explorerのソースコードを調べたところ、EDTの動作を検査するカスタムを作成したようです。このコードは、別のプロジェクトSwingHelperに関連しているようです。

編集2

プロジェクトのサイトはまもなくhttp://java.net/projects/swingexplorerに戻ります。

于 2010-12-18T13:18:35.190 に答える
1

あなたのアプローチは、EDTで行われた実際の作業量(おそらく、不適切に設計されたアプリでは多すぎる)とその作業を行うマシンの能力の両方を考慮に入れているため、「応答性」の測定には理想に近いと思います。

ところで、私はかつてEDTの交換/再ルーティングを試みましたが、何時間も経った後、リフレクションを無謀に使用して実装クラスのプライベートフィールドにアクセスしても不可能であることがわかりました。結局、すべてが待機中のローカルオブジェクトに依存していましたが、これを把握することは不可能でした。

同じ理由で、EDTをインターセプトして、処理されたイベントの数などの情報を取得することはできないと思います(これは、使用できるメトリックの最初のアイデアでした)。

于 2010-12-18T09:41:05.033 に答える