Измерение «занятости» потока диспетчеризации событий - PullRequest
1 голос
/ 17 декабря 2010

Я бы хотел измерить "занятость" моей темы диспетчеризации событий. Одна из возможных идей - создать фоновый поток, который выполняет что-то вроде:

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 до его отправки. Это дало бы приблизительное представление об отзывчивости интерфейса.

Имеет ли это смысл? Есть ли какой-нибудь более стандартный способ сделать что-то подобное?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2010

Я использую отличный инструмент для этого: SwingExplorer. Он позволяет вам проверять компоненты Swing, видеть, как они рисуются, выявлять нарушения EDT и обнаруживать зависания EDT. По сути, вы вводите значение длительности в миллисекундах, а затем играете с вашим приложением. Когда EDT зависает дольше, чем это время, зависание регистрируется в пользовательском интерфейсе инструмента.

Официальный сайт - https://swingexplorer.dev.java.net,, но, кажется, он не работает в тот момент, когда я пишу этот ответ. Вы можете найти плагин для Eclipse и NetBeans, а также найти swingexplorer в репозитории maven, если вы используете maven (извините, на данный момент я не могу найти ссылку)

По крайней мере, хранилище все еще доступно: cvs -d :pserver:guest:guest@cvs.dev.java.net:/shared/data/ccvs/repository co swingexplorer

Редактировать

Я посмотрел исходный код проводника Swing, и оказалось, что они написали пользовательский EventQueue для проверки поведения EDT. Код, похоже, связан с другим проектом, SwingHelper .

Редактировать 2

Сайт проекта скоро вернется на http://java.net/projects/swingexplorer

1 голос
/ 18 декабря 2010

Я думаю, что ваша оценка близка к идеальной в измерении «отзывчивости», поскольку она учитывает как фактический объем работы, выполненной в EDT (возможно, слишком много в плохо спроектированном приложении), так и способность машины сделать это работа.

Кстати, я однажды попытался заменить / перенаправить EDT, но спустя много часов я обнаружил, что это было невозможно, даже когда безрассудно использовал отражение для доступа к закрытым полям классов реализации. В конце концов, все зависело от ожидаемого локального объекта, который невозможно было удержать.

Я подозреваю, что по той же причине невозможно перехватить EDT для получения информации, такой как количество обработанных событий (это была моя первая идея для метрики, которую вы могли бы использовать).

...