Измерение занятости потока диспетчеризации событий

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

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

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


person Joonas Pulakka    schedule 17.12.2010    source источник


Ответы (2)


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

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

По крайней мере, репозиторий все еще доступен: cvs -d :pserver:guest:[email protected]:/shared/data/ccvs/repository co swingexplorer

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

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

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

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

person barjak    schedule 18.12.2010
comment
Вау, я никогда не слышал об этом инструменте! Надо попробовать. - person Joonas Pulakka; 19.12.2010

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

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

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

person Michael Borgwardt    schedule 18.12.2010