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

编辑

我查看了 Swing explorer 的源代码,似乎他们编写了一个自定义EventQueue来检查 EDT 行为。该代码似乎与另一个项目SwingHelper相关。

编辑 2

该项目的站点将很快返回http://java.net/projects/swingexplorer

于 2010-12-18T13:18:35.190 回答
1

我认为您的方法在衡量“响应能力”方面接近理想,因为它考虑了 EDT 中完成的实际工作量(在设计不佳的应用程序中可能太多)和机器完成这项工作的能力。

顺便说一句,我曾经尝试替换/重新路由 EDT,但经过几个小时后,我发现即使鲁莽地使用反射来访问实现类的私有字段也是不可能的。最后,一切都取决于正在等待的本地对象,这是无法掌握的。

我怀疑出于同样的原因,不可能拦截 EDT 以获取诸如已处理事件数量之类的信息(这是我对您可以使用的指标的第一个想法)。

于 2010-12-18T09:41:05.033 回答