Сравнение производительности Java приложений в среде Windows 2000 Pro и Red Hat Linux 7.2.
Возможность Java программ, будучи написанными и скомпилированными на одной платформе, выполняться на другой, хоть и с небольшими проблемами, но все-таки выполняется. Java приложения, написанные и скомпилированные под Windows выполняются на Linux и наоборот, если конечно учесть различия файловых систем, не запускать внешние команды (java.lang.Runtime.exec(…)), а также не использовать JNI.Производительность Java приложений под различными ОС невооруженным взглядом не заметна, и у меня возникло желание провести тесты для различных типов приложений. Причем на одном и том же компьютере, на котором одновременно установлены и Windows, и Linux. В качестве среды для разработки и компиляции приложений был взят знакомый мне Oracle JDeveloper 9i, в качестве сервера приложений Oracle Containers for Java(OC4J). Объекта тестирования была выбрана последняя на данный момент версия JDK 1.4.1_01. Также в качестве одного из тестирующих инструментов использовался ApacheBench , входящий в состав сервера Apache2 (естественно, для каждой для ОС свой).
Отметим, что OC4J были установлены в единственном экземпляре на раздел FAT32, вмонтированном в файловую систему Linux (о работе и настройке OC4J я надеюсь написать в следующей статье).
Были разработаны 9 тестов для сравнения скорости выполнения приложений работающих с: графикой, файлами, математическими операциями, сокетами, строками, XML, XSLT, серверных приложений JSP и Web-сервисов (исходный код тестов). Тесты не подгонялись под какую либо ОС. Каждый тест выполнялся под Windows, Linux без графической оболочки, Linux+KDE по два раза и затем бралось среднее арифметическое времени выполнения.
Так как производительность Java приложений под Windows мне хорошо известна, то время выполнения теста на Windows я взял за 100%, а время выполнения на Linux считал в процентах от него.
Время выполнения в миллисекундах:
Тест | Windows | Linux(текст) | Linux(KDE) | Linux(текст),% | Linux(KDE),% |
Графика | 23110 | 63955 | 0,00 | 276,74 | |
Файлы | 211593 | 177938 | 172946 | 84,09 | 81,74 |
Математические операции |
221609 | 221814 | 222361 | 100,09 | 100,34 |
Сокеты | 289656 | 80617 | 82205 | 27,83 | 28,38 |
Строки | 160875 | 162681 | 166106 | 101,12 | 103,25 |
XML | 75250 | 80780 | 79434 | 107,35 | 105,56 |
XSLT | 141697 | 110054 | 111490 | 77,67 | 78,68 |
JSP(c инициализацией) | 14489 | 7864 | 54,28 | 0,00 | |
JSP(без инициализации) | 6328 | 991 | 15,66 | 0,00 | |
Web Service | 164906 | 142519 | 150362 | 86,42 | 91,18 |
Как видно из таблицы на Linux Java
несколько быстрее работает с файлами, однако, на самом
деле все не так просто, так как изначально тесты для
каждой ОС выполнялись на файловой системе FAT32. К
сожалению раздела NTFS на моем жестком диске не нашлось,
а вот при выполнении того же теста на Linux разделе
EXT3, среднее время - 363887 миллисекунд, так что
результат далеко неоднозначен.
Linux в три раза проигрывает Windows в отображении графических интерфейсов Swing (даже пришлось отказаться от изображения этой колонки на диаграмме). Сложности Linux видны даже невооруженным глазом во время работы тестов и даже при запуске JDeveloper 9i.
Математические операции выполняются практически одинаково, также как операции со строками и XML (парсинг и работа с DOM). Удивительно, что XSLT преобразование почему-то на Linux выполняется быстрее, хотя возможно, что здесь сказалась более быстрая работа с файлами, но в таком случае следует признать, что непосредственно XML парсинг на Linux идет медленнее.
Linux значительно обгоняет Windows на серверных приложениях. Например, операции с сокетами на Linux выполняют в 4 раза быстрее. Работа с Web сервисами, при помощи Java клиента происходит на 20% быстрее. Тестирование JSP страниц при помощи утилиты ApacheBench (100 запросов, одновременно при 10 параллельно) дало просто поразительные результаты - работа уже инициализированной страницы JSP на Linux в 5 раз быстрее! При чем если сохранить получаемую страницу и обратиться к ней через Web сервер Apache, то получаем следующие результаты Windows - 250 миллисекунд, Linux - 80 миллисекунд.
В
итоге можно сделать следующий вывод, если для клиентских
приложений Windows будет быстрее, чем Linux, а для
серверных как раз наоборот. Отметим, что были
использованы простейшие тесты, которые, возможно, не
отображают реальную картину соотношения
производительности Java приложений.