Самый быстрый способ создать диалог сообщений Java (swing / awt / other)? - PullRequest
12 голосов
/ 03 февраля 2009

Я создаю приложение Java, которое будет выполнять некоторую обработку, а затем должно отобразить сообщение для обратной связи с пользователем.

Однако, это кажется невероятно медленным - возвращение занимает более двух секунд.

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

package SwingPlay;

import javax.swing.JFrame;

public class Dialog
{

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "DialogDemo" );
    }

}

Я выполняю это из командной строки с помощью:

java -classpath . SwingPlay.Dialog

Как видите, я ничего не делаю, но создаю JFrame, даже не отображая его.

Если это уместно, вот мой java -version вывод:

java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)

И это (в настоящее время) работает с Win XP SP2.

<Ч />

Итак, первый вопрос: почему это так медленно?

Что более важно, я просто хочу, чтобы простое сообщение (GUI, а не cmdline) отображалось без задержки - может кто-нибудь предоставить какой-нибудь код для этого?

<Ч />

Обновление:

Может пригодиться немного фона:
Я создаю приложение, у которого будет много «головок» (то есть разные пользовательские интерфейсы, использующие одни и те же базовые классы для выполнения сложных частей).
В настоящее время у меня есть чистый заголовок командной строки, который работает нормально - отвечает сразу.
У меня также будет стандартное приложение с обычным графическим пользовательским интерфейсом, и я не предвижу проблем с этим битом.
В настоящее время я работаю над гибридом этих двух компонентов - он будет запущен из окна «Выполнить» (или аналогичного средства запуска), возможно, с аргументами, и ему нужно только эффективно ответить сообщением о состоянии, которое может быть отклоненным нажатием клавиши.

Последний вопрос, на котором сосредоточен вопрос.

Хотя я не против использования моей существующей версии командной строки со сценариями оболочки (хотя я и не думал, что это будет необходимо!), Существующие ответы, похоже, говорят о том, что для меня все работает не так быстро, как для другие - один пример занимает 1460 мс для меня, а 70 мс - существенная разница.

Ответы [ 10 ]

11 голосов
/ 04 февраля 2009

Причина задержки заключается в том, что Java является интерпретируемым языком, и для запуска новой JVM (интерпретатора) требуется время

На самом деле создание кадра занимает менее нескольких мс (около 70 мс на моем компьютере).

Если это будет использоваться в приложении Java, вам не нужно беспокоиться об этом. Это будет почти мгновенно (для этого вы должны использовать JDialog или JOptionPane)

Если это НЕ будет использоваться внутри приложения Java, и 2 секунды это слишком много (и я думаю, что это слишком много), вы должны рассмотреть другой инструмент для работы.

Вот как я измеряю время в вашем коде:

import javax.swing.JFrame;

public class Dialog {

    public static void main( String[] args ) {
        long start = System.currentTimeMillis();
        JFrame frame = new JFrame( "DialogDemo" );
        System.out.println( "Took: " + (  System.currentTimeMillis() - start   ) );
    }

}
4 голосов
/ 03 февраля 2009

Я бы использовал JOptionPane , чтобы показать сообщение. Вот простой пример:

import javax.swing.*;

public class OptionDemo {
    public static void main(String[] args) throws Exception {
        JOptionPane.showMessageDialog(null, "Hello World");
    }
}

Боюсь, я не могу объяснить задержку, которую вы испытываете, хотя. В моей системе ваш фрагмент кода выполняется за 500 миллисекунд.

3 голосов
/ 03 февраля 2009

Java не подходит для этого. Настройка JVM включает в себя множество вещей, происходящих в фоновом режиме до того, как может быть выполнена первая строка кода Java, и на самом деле нет способа обойти это.

2 голосов
/ 04 февраля 2009

Вам нужно использовать Java для отображения окна сообщения? Если окно приходит из-за пределов вашего приложения, вы можете использовать что-то еще для создания диалога.

Создание собственного приложения Windows, которое просто отображает окно сообщения из строки командной строки, может занять максимум несколько часов. У большинства распространенных языков сценариев должны быть способы сделать это тоже. Вот пример от парня через javascript через командную строку:

http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html

2 голосов
/ 03 февраля 2009

Также было бы намного быстрее создать Окно AWT (или, может быть, Frame ) вместо JFrame , потому что последнее должно вытягивать множество дополнительных файлов классов.

1 голос
/ 29 июня 2013

Поскольку вы заинтересованы в ускорении этого процесса, и поскольку большая часть накладных расходов, по-видимому, связана с издержками запуска JVM, проверьте Nailgun , который направлен на решение проблемы медленного запуска JVM путем поддержания работы JVM в фоновом режиме. все время. В вашем случае после одного запуска библиотека Swing тоже будет кэшироваться (и, надеюсь, после нескольких запусков JITed тоже), что еще больше уменьшит накладные расходы.

Однако этот подход приведет к увеличению использования памяти из-за фоновой JVM, а также вызовет другие проблемы, поскольку может быть непросто определить, когда его выключать.

1 голос
/ 03 февраля 2009

Вы можете использовать JOptionDialog

JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);
1 голос
/ 03 февраля 2009

Да, и если вам не нужно показывать диалог с Java, вы можете использовать KDialog (или его аналог GNOME) или что-то подобное.

0 голосов
/ 04 февраля 2009

Вы пробовали запустить его через профилировщик, как NetBeans ? Если внутри стандартной библиотеки есть узкое место, это хороший способ найти его.

0 голосов
/ 03 февраля 2009

Вероятно, вам понадобится новая функциональность SplashScreen в Java 6 . Вместо того, чтобы ждать загрузки JVM (всегда есть загрузка любой виртуальной машины), это заранее загрузит экран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...