пишите нам 
Ладошки: КПК, Коммуникаторы, Смартфоны, Windows Mobile, Symbian, Palm OS PDA и гаджеты
Ладошки: КПК, Коммуникаторы, Смартфоны, Windows Mobile, Symbian, Palm OS PDA и гаджеты
Ладошки: КПК, Коммуникаторы, Смартфоны, Windows Mobile, Symbian, Palm OS PDA и гаджеты
Ладошки к Солнцу! Ладошки: КПК, Коммуникаторы, Смартфоны, Windows Mobile, Symbian, Palm OS PDA и гаджеты

Интернет реклама УБС
ToodleDo: он-лайн список дел, клиенты под iPad/iPhone/Android/WM. Будьте эффективным!
 

Приветствуем на Ладошках!

Ладошки, у меня РАНЧИК РОДИЛСЯ! :-) ... Уважаемые давние поклонники и посетители Ладошек! Я запускаю коммьюнити-сайт, новый проект, а вы все, будучи https://www.facebook.com/run4iq Бег для интеллектуалов. Бег для интеллекта. Бег "за" интеллектом. Он сам не придёт ;-) Ранчик родился! Андрей AKA Andrew Nugged Ладошки служат как архив программ для Palm OS и Poclet PC / Windows Mobile и разрешённых книг с 15 окрября 2000 года.
 
Статьи на Ладошках: о КПК и гаджетах
список групп статейВы пишете статьи? Контактируйте с нами!

 
Кто на свете всех быстрее: тестирование машин Java для Pocket PC


Автор/Источник: Антон Борисов
» 04.02.2008 22:37,
просмотров сегодня: 1, всего: 10166
статья размещена в группе: Программы
оценка: 4.455, 11 голосов


Пусть вас не смущает данный заголовок — речь пойдет не о скорости перемещения некоего физического тела в пространстве, а о производительности байт-кода в различных виртуальных Java-машинах. Конечно же, нам интересны именно JVM, предназначенные для платформы Pocket PC. И вполне естественно, что мы также затронем аспекты исполнения кода с использованием AWT, Swing и SWT.

PersonalJava

Анонсируя эпоху виртуальных Java-машин, компания Sun Microsystems конечно же имела ввиду, что придется выпускать JRE (Java Runtime Environment) не только для перспективных, настольных платформ. Но также пробовать свои силы и в мире, где особо ценится память и производительность. А именно, на таких устройствах, как Handheld/PC. Поэтому неудивительно, что первой Java-машиной для Windows CE был продукт от Sun. Это уже позднее, когда становятся доступными спецификации на реализацию виртуальных машин, другие компании пробуют свои силы на этом рынке.

Версия виртуальной машины для Pocket PC от Sun называется PersonalJava. Последняя ее версия была выпущена в ноябре 2000 года и с тех пор компания хранит загадочное молчание. Будет ли продукт развиваться и как скоро он появится снова на рынке — вот одни из самых актуальных вопросов. То, что внутри Sun продукт развивается до сих, не вызывает сомнений. Известно, что предварительное имя обновленного продукта носит название «PhoneME». Но когда он выйдет — тайна за семью печатями. Впрочем, есть основание, что произойдет это событие достаточно скоро. Ведь для ведения бизнеса на поле мобильных устройств, нужно, чтобы затраты на разработку продукта окупились. А это станет возможным, когда рынок PocketPC насытится. Т.е., когда коммуникатором на основе Windows Mobile уже трудно будет удивить соседа. А судя по тому, что смартфоны уже догоняют по техническим характеристикам коммуникаторы, и вооружившись статистикой совокупных продаж устройств обоих типов, вполне вероятно, что середина или конец следующего года являются датой икс.

PersonalJava может быть установлена на устройства с Windows CE 2.11 и выше. Минимальный размер RAM для работы JVM — 16 Мб. И шесть мегабайт требуется для установки виртуальной машины с демонстрационными примерами. Номер спецификации PersonalJava 1.1.3 — это примерно соответствует настольной версии JDK 1.1.6. Для современных требований разработки это уже сильно устаревший стандарт, но простое приложение под эту JVM можно набросать и сейчас. Самое интересное, что оно действительно будет работоспособным. Но об этом чуть позднее.

Что же реализовано в PersonalJava? Классы:

	java.awt
	java.io
	java.math
	java.rmi
	java.sql
	java.util.zip

Также включена поддержка JNI (Java Native Interface). Т.к. поддержка java.sql задекларирована, то JDBC API в принципе обязан будет работать.

Чего нет?

Класс java.security не реализован. Например, некоторые классы в пакете java.io реализованы по-другому (в отличие от настольной JVM). А некоторые пакеты вообще носят статус опциональных. Полный их список приведен в PJAE (PersonalJava Application Environment Specification).

Однако, фактически перед нами вполне функциональная Java-машина. На которой можно и нужно попробовать запустить простенькую программу.

Обратимся к примерам, которые распространяются вместе с PersonalJava. Их можно найти в \Program Files\Java\GUIWindow\, \Program Files\Java\JavaMenu\, \Program Files\Java\Welcome\. Возьмем и запустим класс Welcome. И увидим веселое существо под названием Duke.


Рис. 1 — Класс, идущий в комплекте с PJava, успешно запущен

Исходный код данного примера достаточно тривиален — Welcome.java.

import java.awt.*;
import java.awt.event.*;
import java.io.PrintStream;

class Welcome extends Frame implements ActionListener {

    Welcome(String as[]) {

        super(«Welcome»);
        text = new TextArea(«Congratulations, AWT works!», 5, 20, 3);

        setLayout(new BorderLayout());
        add(«South», text);
        setSize(150, 200);
        show();

        WelcomeCanvas welcomecanvas = new WelcomeCanvas();
        MediaTracker mediatracker = new MediaTracker(welcomecanvas);
        java.awt.Image image;

        if(as.length < 1)
            image = getToolkit().getImage(«Duke.gif»);
        else
            image = getToolkit().getImage(as[0]);

        if(image == null) {
            System.out.println(«Error loading image»);
            return;
        }

        mediatracker.addImage(image, 0);

	try {
            mediatracker.waitForAll();
        } catch(Exception exception) {
            exception.printStackTrace();
        }

        welcomecanvas.setImage(image);
        add(welcomecanvas, «Center»);

        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent windowevent) {
                System.exit(0);
        	}

    	    }
	);

        show();
    }

public static void main(String args[]) {
        new Welcome(args);
}

    public void actionPerformed(ActionEvent actionevent) {
        System.out.println(actionevent.getActionCommand());
        if(actionevent.getActionCommand().equals(«Close»))
            System.exit(0);
    }

    TextArea text;
}

class WelcomeCanvas extends Canvas {

    public void setImage(Image PaintImage) {

        image = PaintImage;
        clear = true;
        repaint();
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void paint(Graphics g) {
        if(image == null) {
            g.setColor(Color.black);
            g.fillRect(0, 0, getSize().width, getSize().height);
            return;
	}

        g.setColor(Color.white);
        g.fillRect(0, 0, getSize().width, getSize().height);
        g.setColor(Color.green);

        int i = image.getWidth(this);
        int j = image.getHeight(this);

        if(i >= 0 && j >= 0)
            g.drawImage(image, (getSize().width — i) / 2, (getSize().height — j) / 2, this);
    }

    WelcomeCanvas() {}

    Image image;
    boolean clear;
}

Попробуем теперь скомпилировать программу. Если у вас достаточно свежий JDK, например, серии 1.5, то компилятор предупредит вас, что некоторые методы в программе устарели.

anthony@suse:~/src/java/awt> javac Welcome.java
Note: Welcome.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

Впрочем, это обстоятельство нисколько не мешает. Перед нами лежит класс, который работает на настольной системе.


Рис. 2 — Перекомпилированный класс запускается на настольной системе

Остается перенести все необходимые файлы на мобильное устройство. И убедиться, что они не исполняются. Как же так?


Рис. 3 — Тот же самый класс PJava игнорирует

На настольной системе JVM запускает нормально, а на PocketPC происходит ошибка. Но давайте вспомним, что на настольной системе мы компилировали достоточно свежей версией Java. И получили мы классы для современной JVM.

Впрочем, не все так сложно, как кажется. Предположим, что проблема решится, если мы будем получать байт-код в той же версии JDK, что была распространена в 2000 году, а именно версией 1.1.6. Вполне вероятно, что при совпадении версии байт-кода с версией JVM от PersonalJava наш класс запустится.

Однако, для проверки нашей гипотезы следует поступить проще. В нашем коде мы используем только те классы, что реализованы в Personal Java (не зря мы посмотрели в спецификацию PJAE). Следовательно, байт-код должен быть сгенерирован современным javac компилятором совместимым со старой спецификацией. Но он все-таки не запустился. Почему?

Давайте проверим версии старого класса и нового.

anthony@suse:~/src/java/awt> file Welcome.class
Welcome.class: compiled Java class data, version 49.0

Это наш новый, а вот и старый, оригинальный, из поставки PJava.

anthony@suse:~/src/java/awt> file Welcome.pjava.class
Welcome.pjava.class: compiled Java class data, version 45.3

Бинго! Версии классов отличаются!

Давайте вручную, любым hex-редактором поменяем версии Java в байт-коде. Это идеологически неправильно, но для проверки гипотезы сгодится.

Структура заголовка следующая: сигнатура (4 байта — 0xCA, 0xFE, 0xBA, 0xBE), минорная и мажорная версии используемого JDK.

В оригинальном байт-коде заголовок следующий: CA FE BA BE 00 03 00 2D. Представляет из себя сигнатуру (знаменитая фраза «CAFEBABE»), 2 байта — минорная версия (0x00, 0x03) и 2 байта — мажорная версия (0x00, 0x2D). В свеже скомпилированном байт-коде заголовок состоит из несколько других байтов: CA FE BA BE 00 00 00 31. Надеюсь, догадаетесь, что на что следует поменять?

Передаем файлы на устройство и убеждаемся, что код работает. Ура!


Рис. 4 — Изменение версии JDK приносит свою пользу

Впрочем, функционал, что можно получить с помощью AWT, конечно несравним с современными требованиями. Но такие вещи, как вопроизведение звукового файла получить все-таки можно.

Итак, рассмотрим следующий пример — Au.java.

import java.io.*;
import sun.audio.*;
import java.awt.*;
import java.awt.event.*;

public class Au extends Frame {

	public static void main(String[] args) {
	Au win = new Au(«Audio-Test»);
	win.setBounds(20, 20, 100, 100);
	win.setVisible(true);
	}

	public Au(String title) {
		super(title);
		Button button = new Button(«Start»);
		add(button);
		button.addActionListener(new ButtonListener(button));
	}
}

class ButtonListener implements ActionListener {
	Button button;
	public ButtonListener(Button button) { }

	public void actionPerformed(ActionEvent event) {

		FileInputStream inputStream;
		AudioStream audioStream;
		try {
			inputStream = new FileInputStream(«Click.au»);
			audioStream = new AudioStream(inputStream);
			AudioPlayer.player.start(audioStream);
		} catch (Exception exc) {}
	}
}

В данном примере воспроизводится звуковой файл в формате «Sun/NeXT audio data: 8-bit ISDN mu-law, mono, 8000 Hz». Его можно получить с помощью звукового редактора CoolEdit Pro, Audacious, с помощью утилиты sox или с помощью любого другого редактора.

Не забудем отредактировать заголовок в байт-коде и запускаем на PocketPC.


Рис. 5 — Более функциональное AWT-приложение на PocketPC

Судя по тому, что при воспроизведении звука заметны захлебывания, можно сделать вывод, что PersonalJava все-таки не оптимизирована. По крайней мере под современные технические гаджеты. Хотя это и понятно.

Чтобы облегчить себе работу в дальнейшем, давайте посмотрим, как составлять файлы-ссылки (аналог командного файла).

	255#"\Program Files\Java\bin\pjava.exe» -setcwd "\Storage Card\jvm\ppc» -verbose -file Au.class

В данном примере, 255 означает длину командной строки. Хотя на самом деле она короче, но чтобы каждый раз не считать количество символов, указываем интерпретатору максимально возмножное число. Далее вызываем программу с перечисленными параметрами. Кавычки используются из-за того, что в имени директории или файла есть пробелы.

Ряд ключей, которые могут быть полезны при составлении файла-ссылки для запуска PersonalJava:

  1. -file
  2. -setcwd
  3. -v -verbose
  4. -verbosegc
  5. -mx <Число>
  6. -classpath <Директории>

Ключ "-file» указывает на название .class, .jar или .html-файла. Любой из этих 3 типов файлов будет исполнен JRE. В случае с .html подразумевается, что в нем хранится описание java-апплета.

	"\Program Files\Java\bin\pjava.exe» -file Au.jar

Ключ "-setcwd» позволяет выставить в качестве текущей нужную директорию.

	"\Program Files\Java\bin\pjava.exe» -setcwd "\Storage Card» -file Au

Ключ "-v» или "-verbose» включает режим информативности

Ключ "-verbosegc» позволяет увидеть, когда происходит сборка мусора

Следующий ключ, "-mx <Число>" позволяет выставить размер кучи

И ключ "-classpath <Директории>" позволяет задать список директорий, в которых следует искать дополнительные классы.

	"\Program Files\Java\pjava.exe» -classpath "\Storage Card\SWT.jar; \MyClasses» -file Au

Плюсом к данной Java-машине может служить тот факт, что она работает даже на старых устройствах. Иногда это бывает удобно, когда нужен несложный код и возможность запуска не только на WM2003 / WM5.

CreMe

Над этой виртуальной машиной трудится израильская компания NSIcom. И, надо сказать откровенно, достаточно эффективно. У них есть ряд интересных примочек, позволяющих получить отличное время для исполнения кода — это технология JBooster и интеллектуальное управление памятью. Так, при старте виртуальной машины оценивается количество свободной памяти и выбирается оптимальная стратегия — если RAM недостаточно, то выполнение кода будет несколько медленнее, чем ожидалось. Согласитесь, такое выполнение все-таки лучше, чем обыкновенный незапуск JVM. Минус у такого подхода — некоторое увеличение времени запуска машины — пока-то оптимизатор примет решение. Правда, в дальнейшем это окупится с лихвой — байт-код будет выполняться достаточно быстро. Попробуйте запустить тот код, что мы пробовали под PersonalJava — воспроизведение идет без рывков.


Рис. 6 — Аудио-приложение воспроизводит звук без рывков под CreMe JVM

Дополнительные пакеты, которые можно забрать на сайте, позволят создавать программы с поддержкой HTTPS / SSL / RMI / Swing. Правда, версия Swing всего 1.1.1, но красивость программ будет обеспечена.


Рис. 7 — Установка пакета swingall.jar позволит запускать Swing-приложение

На данный момент выпускаются две версии — 3.29 и 4.12. Первая совместима со спецификацией PersonalJava 3.1, а фактически с версией JDK 1.1.8. Вторая же версия совместима со спецификацией CDC1.1 (Connected Device Configuration).

Сейчас уже принято обозначать Java-спецификации для мобильных устройство как CDC/PP (Connected Device Configuration with Personal Profile) или CLDC/Midlets (Connected Limited Device Configuration with Midlets). Что должно интерпретироваться следующим образом — спецификация CDC/PP предназначена для коммуникаторов и продвинутых смартфонов, где можно запустить отдельное Java-приложение либо в виде класса, либо в виде jar-файла. И объем памяти достаточен для запуска отдельного приложения.

Если это условие не выполняется из-за объема памяти, то для этих устройств должна использоваться Java-машина, совместимая со спецификацией CLDC/Midlets. Где количество классов урезано, и, соответственно, памяти требуется меньше. При этом Java-приложения называются мидлетами, и расширение у них — .jad

Впрочем, вернемся к продукту CreMe. Еще одной интересной чертой, которой обладает CreMe, является возможность отладить код на настольной машине. Для этого на сайте найдите пакет CreMe Developer Support Kit и разверните его на вашей рабочей машине. После этого можете свободно отрабатывать код на Microsoft Windows 2000 / XP, а затем уже забрасывать окончательный вариант на мобильное устройство.

255#"\windows\creme\bin\CrEme.exe» -wd '\Storage Card\java\imageviewer\awt' W2

В проспектах от NSIcom отмечается, что версия 3.25 может запускаться на устройствах с WinCE 3.0. На практике же, чуть более поздняя версия (3.29) заработала только начиная с WM2003.

Отмечу, что разработка от NSIcom платная — версия JVM будет работать 30 дней.

Jeode

Было время, когда iPAQ'и комплектовались Java-машиной под названием Jeode. Над разработкой трудилась компания Insignia, однако после финансовых трудностей наработки были переданы швейцарцам, в компанию Esmertec. У них к тому времени была своя версия JVM, которую они распространяли среди OEM-заказчиков — JBed. Насколько хороша та или иная версия уже от компании Esmertec судить тем читателям, у кого на устройстве эта JVM преустановлена. Мы же возьмем оригинальную, от компании Insignia, которую можно найти в свободном доступе. И замерим время запуска самого простого AWT-приложения.


Рис. 8 — AWT-приложение по проверке производительности JVM

Код класса, измеряющего время запуска JVM

import java.awt.*;
import java.awt.event.*;
import java.io.PrintStream;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


class W2 extends Frame implements ActionListener {

    W2(String as[]) {
        super(«AWT Perfomance Sample»);
	setSize(180, 80);
        text = new TextArea(«AWT Perfomance Sample», 1, 1, 3);
        setLayout(new BorderLayout());
        add(«South», text);

        show();
        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent windowevent) {
                System.exit(0);
            		}
        	}
	);

        show();
    }

    public static void main(String args[]) {

	long start = System.currentTimeMillis();
	new W2(args);
	long end = System.currentTimeMillis();

	System.out.println( "=================" );
	System.out.println( «Init time:" );
	System.out.println( end — start );
	System.out.println( "=================" );
    }

    public void actionPerformed(ActionEvent actionevent) {
        System.out.println(actionevent.getActionCommand());
        if(actionevent.getActionCommand().equals(«Close»))
		System.exit(0);
    }

    TextArea text;
}

Переменные start / end нужны для замера времени, когда JVM начала запускаться, создавать программные классы и когда был установлен главный цикл. Т.е., мы узнаем время на инициализацию данной JVM. Несколько строк с участием System.out.println нужны для возможности запуска кода в PersonalJava.

К сожалению, в данном релизе Jeode JVM нет ключа, выставляющего текущую директорию в нужное нам расположение, поэтому скомпилированные классы придется переписать в корень — '\'. А для удобства, создадим ярлык быстрого запуска:

	255#"\windows\evm.exe» W2

Инициализация проходит достаточно быстро — 2335 миллисекунд. Для устройства с 64 Мб памяти и PXA270 вполне неплохо.

Стоит отметить, что Swing на Jeode теоретически может запуститься — хотя Sun и поместил Swing 1.0.3 и Swing 1.1.1 в список устаревших технологий, но их все еще можно найти на их сайте. И попробовать вместе с Jeode.

Это тестовое AWT-приложение чуть позже мы прогоним на всех виртуальных машинах. А пока движемся далее.

Mysaifu JVM

Это первая из рассматриваемых нами виртуальных машин, которая является бесплатной. Основывается она на classpath — альтернативе классов Sun Microsystems. Classpath разрабатывается организацией GNU. На основе classpath сделаны ряд других виртуальных машин, например, jamvm, sablevm, однако данные VM распространены в мире Unix / Linux.

По большинству тестов, Mysaifu JVM является самой медленной виртуальной машиной. Впрочем, для запуска нашего AWT-приложения потребовалось всего-то 3 секунды.

Реализация самой JVM вполне прилична. Версия, которую можно найти на сайте, работоспособна на КПК с WM2003 и более поздних.

	255#"\Storage Card\Program Files\Mysaifu JVM\jre\bin\jvm.exe» -Xconsole -setcwd "\Storage Card\java\awt\" W2
IBM J9

Надо отдать должное компании IBM — они не только разрабатывают IDE Eclipse (который сам основан на Java), но также заняты и в разработке JVM для ряда платформ. В частности, их JVM для мобильных систем известна под именем J9 и о ней можно почитать на сайте IBM — раздел «IBM WebSphere Everyplace Micro Environment».

Виртуальная машина выпускается как для устройств, попадающих под спецификацию CDLC (это те, что умеют запускать только мидлеты), так и для настоящих КПК, со спецификацией CDC/PP. Последняя версия J9 (6.1.2) — поддерживает устройства с WM5 и выше, но если хорошенько поискать, то можно найти и версию 5.7. В ней можно разрабатывать и под WM2003. Еще более ранние версии J9 могут производить байт-код и под WinCE 3.0, правда автору так и не удалось сей дистрибутив найти.

Если вы вплотную общались с CreMe, т.е. отлаживали код на настольных машинах, а на КПК переносили байт-код только для окончательной проверки, то по достоинству должны оценить IBM'вский пакет «Micro Environment». Т.к. разработчики более не привязываются к одной платформе, к Microsoft Windows, а могут обкатывать байт-код и под Linux-платформой. А переносить результат на КПК не через ActiveSync, а посредством SynCE. Ну, или по-прежнему, через ethernet-соединение.

Как я уже отмечал, единственной бесплатной виртуальной машиной является только Mysaifu JVM. Все остальные, в том числе и IBM J9, являются платными. Так, версия 6.1.2 стоит примерно 25 / 30 USD, и компания IBM продает ее через своего партнера — Handango. Предыдущие версии стоили порядка 6 USD.

Ярлык для быстрого запуска приложения следующий:

	255#"\Program Files\J9\PPRO11\bin\j9.exe» "-jcl:ppro11» W2

Теперь самое время провести замеры на быстроту инициализации JVM и выполнения байт-кода.

Название JVM Mysaifu JVM PJAVA JEODE CreMe IBM J9
Время инициализации JVM, в мс
(WM2003/WM6)
3000 / 3000 2000 / 1000 2395 / 2335 3882 /
6456 (V3.29)
8202 (V4.12)
3280 / 8388

В случае с CreMe произошла интересная история. В WM6 время инициализации изначально было около 12000 миллисекунд. Что привело в изумление. Это самый высокий показатель, даже по сравнению с аналогичными данными под WM2003. Как оказалось, был установлен, но не использовался пакет Swing. После удаления, время запуска снизилось. Также подозрительно долго запускался J9, что наводит мысль о наличии в нем оптимизирующего кода.

На настольной системе (Intel P4, 2.8 GHz), при использовании JRE 1.5, время инициализации этого AWT-приложения составляет 172 миллисекунды.

Откровенно говоря, сама концепция AWT (Abstract Window Toolkit) была разработана настолько давно, что за это время успела устареть и используется сейчас в основном учебных целях. Хотя, как видели на примере с PersonalJava, есть еще порох в пороховницах. Давайте посмотрим, что представляет собой AWT и какие решения пришли ему на смену.

Первоначально, AWT являлся самым первым GUI-тулкитом, представленным Sun Microsystems вместе с JDK 1.0 — это было в 1996 году. И являлся Java-оберткой вокруг API операционной системы, где исполнялась виртуальная машина. Т.е., для того, чтобы нарисовать полоску меню или кнопку или окно, вызывалась java-функция (например, так — new Button()), которая в свою очередь вызывала native-функцию операционной системы. Этот промежуточный слой в виде AWT и JNI (Java Native Interface) был достаточно "тонким". И конечно же, сами приложения выглядели на разных платформах по-разному.

С появленим следующей, достаточно грандиозной версии Java 1.2, был представлен несколько другой подход в области создания GUI-приложений на Java — Swing. Можно сказать, что это была объединенная работа как Sun Microsystems, так и работников Netscape Corporation. Ведь большая часть кода была разработана именно последними, и была известна в свое время как IFC (Internet Foundation Classes), которые в дальнейшем "преобразовались" в JFC (Java Foundation Classes) и стали частью айсберга Swing. Этот тулкит написан полностью на Java, вместо вызова API-функций через JNI, используются низкоуровневые функции по прорисовке точек, линий и т.д., через Java 2D API. Таким образом, Swing является более универсальным решением, нежели AWT, и приложения на основе нового тулкита действительно могут выглядеть единообразно на разных платформах.

Сам пользователь может составить нужное ему представление — как должно выглядеть обрамление, окантовка и т.п. Но следует помнить, что компоненты Swing базируются на AWT. Например, класс JContainer основан на классе Containter (AWT). Поэтому, очевидно, что время выполнения Swing-кода будет больше, чем аналогичного на AWT.

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

Примерно в это же время (конец девяностых), работники в IBM были заняты созданием своего IDE (Integrated Development Environment) под названием VisualAge. Что, в конце-концов, трансформировалось в среду Eclipse, основанной на Java и подтолкнувшей к созданию альтернативы Swing — графическому тулкиту SWT (Standard Widget Toolkit).

SWT фактически является оберткой, но не вокруг native-объектов, как AWT, а вокруг объектов Motif, GTK+ (которые, в свою очередь являются GUI-тулкитами). В тех случаях, когда не получается создать какой-то "универсальный", переносимый класс, то он пишется на Java — аналогично, как в Swing (правда здесь все функции написаны полностью на Java) — и вызывается native-функция из библиотеки SWT под определенную систему. Основная цель создания SWT — получить производительное приложение, которое бы выглядело, как native-приложение в данной, конкретной операционной системе.

Из-за того, что SWT все-таки тесно ориентирован на использование native-функций, нежели Swing, то создание универсально-выглядящего приложения будет трудновато. Хотя есть пара решений, например, библиотека JFace, которая позволяет такое приложение создать.

Еще одним отличительным моментом при использовании SWT является необходимость принудительного удаления объектов (сравните с привычным garbage collector в Java). Связано это, опять-таки, с тесным использованием native-объектов. Т.к., последние не отслеживаются Java-машиной, то память от них нужно вовремя высвобождать — через функцию dispose(). К счастью, таких объектов немного — это унаследованные объекты класса Resource — объекты типа Image, Color, Font. Может показаться, что это возврат назад, от C++ к C. Верно, но только частично — в SWT вместо автоматического сборщика мусора используется всего лишь ручное удаление объектов. Остальное — чистая Java.

Вы можете создать приложения на основе SWT для следующих платформ:

  • Microsoft Windows
  • AIX, FreeBSD, Linux, HPUX (с использованием библиотек Motif / GTK+)
  • Mac OS (с использованием библиотеки Carbon)
  • QNX Photon
  • Pocket PC

Хорошо, разговоры разговорами, но предлагаю замерить время запуска SWT-приложения на PocketPC.

Возьмем один из примеров, что расположены на сайте eclipse.org — Snippet29.java

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class Snippet29 {

public static void main (String [] args) {

	long start = System.currentTimeMillis();


	Display display = new Display ();
	Shell shell = new Shell (display);
	Menu bar = new Menu (shell, SWT.BAR);
	shell.setMenuBar (bar);

	MenuItem fileItem = new MenuItem (bar, SWT.CASCADE);
	fileItem.setText ("&File»);

	MenuItem editItem = new MenuItem (bar, SWT.CASCADE);
	editItem.setText ("&Edit»);

	MenuItem aboutItem = new MenuItem (bar, SWT.CASCADE);
	aboutItem.setText ("&About»);

	Menu submenu = new Menu (shell, SWT.DROP_DOWN);
	fileItem.setMenu (submenu);
	MenuItem item = new MenuItem (submenu, SWT.PUSH);
	item.addListener (SWT.Selection, new Listener () {
		public void handleEvent (Event e) {
			System.out.println («Select All»);
		}
	});


	item.setText («Select &All\tCtrl+A»);
	item.setAccelerator (SWT.MOD1 + 'A');
	shell.setSize (200, 50);
	shell.open ();

	long end = System.currentTimeMillis();

	System.out.println((end — start));

	while (!shell.isDisposed()) {
		if (!display.readAndDispatch ()) display.sleep ();
	}
	display.dispose ();

}
}

Вставляем строчки определения времени инициализации, компилируем и пробуем запускать под разными машинами.

На настольной системе время запуска — 262 миллисекунды. И визуально приложение выглядит так:


Рис. 9 — Так выглядит SWT-приложение на настольной системе

Отказались выполнять код PersonalJava и Jeode. Т.к. версия SWT, которую я использовал, 3.346 (версия JDK 1.4), то неудивительно, что классы в SWT-библиотеке не распознались этими машинами.

Как выяснилось, Mysaifu JVM быстро выполняет только самый элементарный код. На практике, результаты неутешительные.

Виртуальная машина от IBM оказалась на высоте — самый лучший результат. Стоит отметить, что SWT-библиотека поставляется с данной JVM в одном комплекте — разработчики упор делают все-таки на SWT, а не на Swing.

И в целом, неплохие результаты у CreMe.


Рис. 10 — Тоже SWT-приложение запускается под CreMe JVM за 4367 миллисекунды

Название JVM Mysaifu JVM PJAVA JEODE CreMe IBM J9
Время инициализации JVM, в мс 59000 - - 4367 2549

Как я уже отмечал, J9 можно найти и для раритных уже версий операционной системы, таких как WM2002. Там это SWT-приложение тоже работоспособно.


Рис. 11 — IBM J9 запускает приложение и на платформе WM2002

За рамками сегодняшнего рассмотрения остались ряд специализированных тестов по измерению производительности JVM. У нас использовались настолько разношерстные виртуальные машины, с поддержкой разных спецификаций Java, что, по-большому счету, смысла в такой проверке особого и нет. Также не стали рассматриваться ряд решений, распространенных среди OEM-поставщиков, таких как JV-Lite (компания ACCESS — разработчик браузера NetFront), JBed (Esmertec), CEE-J (Skelmir) и ряд других.

На этом краткий экскурс в мир JVM для PocketPC закончен. Успехов в компиляции!

Полезные ссылки:

PersonalJava
  • http://www.sun.com
  • CreMe
  • http://www.nsicom.co.il
  • Jeode
  • http://www.insignia.com
  • Mysaifu JVM
  • http://www2s.biglobe.ne.jp/~dat/java/project/jvm
  • IBM J9
  • http://www.ibm.com
  • SWT
  • http://www.eclipse.org
  • 1   2   3   4   5
    «хуже     ваша оценка     лучше»


    Обсуждение
    05.02.2008 15:00 - Дэйв

    Отлично.
    Спасибо.



    Чтобы писать комментарии вам нужно
    авторизоваться (войти) или зарегистрироваться


     
    Регистрация товарного знака в Украине patent.km.ua.
    Telephones, address and opening times for shops, post and banks in the UK
     
     

     

    статьи
    по этой теме
     
    Мобильное телевидение — поиск оптимального пути с помощью Spb TV
    15-04-2009, рейтинг(общ.): 4.386, просм.: 0/11115

    Визиком — путеводитель по автодорогам
    07-04-2009, рейтинг(общ.): 2.8, просм.: 0/2853

    Spb Mobile Shell 2.0 — пользовательский интерфейс нового поколения (подробный обзор)
    05-03-2008, рейтинг(общ.): 4.525, просм.: 0/27725

    Сводный обзор навигаторов для Pocket PC: TrackyPro, Efficasoft GPS Utilites, GPS Tuner и VITO SmartNavigator
    20-02-2008, рейтинг(общ.): 3.858, просм.: 0/13477

    Файловые менеджеры: Virtual Explorer
    16-01-2008, рейтинг(общ.): 2, просм.: 0/2791

    Файловые менеджеры: Total Commander for Pocket PC
    13-01-2008, рейтинг(общ.): 4.324, просм.: 0/10613

    Файловые менеджеры: Resco Explorer for Pocket PC
    11-01-2008, рейтинг(общ.): 4.395, просм.: 0/9254

    Звонилки для Windows Mobile
    09-01-2008, рейтинг(общ.): 3.952, просм.: 0/18679

    Обзор погодных программ для Pocket PC. Часть 2
    26-12-2007, рейтинг(общ.): 3, просм.: 0/4543

    Обзор погодных программ для Pocket PC. Часть 1
    26-12-2007, рейтинг(общ.): 3.455, просм.: 0/5679

    Spb Traveler — отличный помощник в путешествии
    12-12-2007, рейтинг(общ.): 3.875, просм.: 0/4011

    Вам письмо! (работа с почтой в Windows Mobile)
    26-11-2007, рейтинг(общ.): 2.833, просм.: 0/6295

    Чтение RSS-новостей в Windows Mobile
    16-11-2007, рейтинг(общ.): 3.612, просм.: 0/8019

    ICQ в кармане (версия для Windows Mobile)
    24-10-2007, рейтинг(общ.): 3.581, просм.: 0/72623

    Spb Pocket Plus v4.0 — все лучшее и новое
    23-10-2007, рейтинг(общ.): 4.5, просм.: 0/14230

    PowerCAD — чертим прямо на ладони
    04-09-2007, рейтинг(общ.): 4.101, просм.: 0/7093

    Антивирусы на КПК: предупрежден, значит вооружен!
    23-08-2007, рейтинг(общ.): 4.132, просм.: 0/23152

    Удаленное управление (VNC, RDP, Citrix, NetOp)
    17-08-2007, рейтинг(общ.): 4.095, просм.: 0/47919

    Браузеры мира Pocket PC
    17-07-2007, рейтинг(общ.): 3.357, просм.: 0/9640

    ProfiMail — профессиональный почтальон
    25-05-2007, рейтинг(общ.): 4.125, просм.: 0/4160

    а вы знаете, что есть:
    - рейтинг-каталог сайтов Ладошек?

    поддержите
    Ладошки
     
    Рейтинг Ладошек: КПК, мобильность, коммуникаторы, смартфоны, гаджеты, высокие технологии Рейтинг каталога сайтов Хмельницкого региона Поддержите Ладошки: Как поддержать сайт?
    Использование материалов сайта разрешено только при наличии
    гиперссылки на страницу Ладошек без блокировки индексации
    реклама на сайте    Andrew Nugged © 2000-2015