Требуется время для загрузки всех классов Swing, а затем время для загрузки собственных библиотек AWT. Возможно, загрузка классов занимает больше времени, потому что если вы просто создаете JLabel вместо первого JFrame, это все равно занимает больше времени.

аюсь создать простое, легкое и адаптивное приложение с использованием Java Swing. Однако при запуске запускается заметная задержка (> 500 мс) до появления окна (JFrame).

Я отследил это до конструктора класса java.awt.Window, который является предком JFrame.

Как ни странно, конструктор работает медленно только для первого вызова. Если я создаю несколько объектов JFrame, время, потраченное в конструкторе, составляет ~ 600 мс для первого объекта, но обычно измеряется как 0 мс для последующих объектов.

Вот простой пример, который в моей системе показывает значительную задержку для первого вызова конструктора, но не для второго:

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            long start;

            start = System.currentTimeMillis();
            JFrame frame1 = new JFrame();
            System.out.println((System.currentTimeMillis() - start) + " for first JFrame.");

            start = System.currentTimeMillis();
            JFrame frame2 = new JFrame();
            System.out.println((System.currentTimeMillis() - start) + " for second JFrame.");
        }
    });
}

С типичным выходом:

641 for first JFrame.
0 for second JFrame.

Если я добавлю эту инициализацию объекта Window перед объектами JFrame:

java.awt.Window window = new java.awt.Window(null);

Затем вывод изменится на что-то вроде:

578 for first Window.
47 for first JFrame.
0 for second JFrame.

Когда я пытаюсь сделать то же самое с суперклассом Window, java.awt.Container, конструктор Window по-прежнему остается тем, для выполнения которого требуется много времени (поэтому проблема не выходит за пределы класса Window).

Поскольку конструктор JFrame вызывает конструктор Window, вышеприведенное указывает на то, что первый вызов конструктора Window стоит дорого.

Что происходит при первом вызове конструктора, который занимает так много времени, и могу ли я что-нибудь с этим сделать? Есть ли какое-то простое исправление или проблема фундаментальна для Swing / AWT? Или это, возможно, проблема, специфичная для моей системы / установки?

Мне бы хотелось, чтобы мое приложение открывалось так же быстро (или почти так же быстро), как MS Notepad, и, хотя я могу печатать текст на консоли примерно во время открытия Notepad (если я поместил код до первой инициализации JFrame), Вышеуказанная проблема означает, что перед тем, как окно станет видимым, будет задержка почти на целую секунду. Нужно ли использовать другой язык или графический интерфейс для достижения желаемой производительности?

редактировать: Если я добавлю Thread.sleep (10000) в качестве первой строки run (), результаты не изменятся (они просто появляются через 10 секунд). Это говорит о том, что проблема вызвана не каким-то асинхронным кодом запуска, а вызвана непосредственно вызовом конструктора.

Редактировать 2: Реализовал, что NetBeans Profiler может профилировать внутри классов JRE и обнаружил, что большую часть времени тратится на инициализацию объекта sun.java2d.d3d.D3DGraphicsDevice (объект Window нуждается в границах экрана и вставках), который является частью «Direct3D Accelerated» Конвейер рендеринга для платформ Microsoft Windows, включенный по умолчанию ", представлен вJava 6u10, Его можно отключить, передав JVM свойство «-Dsun.java2d.d3d = false», что сокращает время запуска примерно на 3/4, но я пока не уверен, понадобится ли оно мне (D3D) или если есть какой-то другой способ заставить его загружаться быстрее. Вот вывод, если я помещу этот параметр в командную строку:

0 for first Window
47 for first JFrame.
0 for second JFrame.

Я вернусь и уберу этот пост после того, как буду копать глубже.

Ответы на вопрос(5)

Ваш ответ на вопрос