Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

Двоичные коды Vs Байт-коды

div.main {margin-left: 20pt; margin-right: 20pt}Двоичные коды Vs Байт-коды Динамическая компиляция против статической компиляции - сравнение производительности

Некоторое время я работал над статьей о новинке Sun-а - архитектура процессора MAJC, который имел некоторые удивительные возможности для повышения скорости работы кода Java. MAJC это высокопроизводительный, много задачный, встраеваемый процессор, хотя несмотря на это были бы предложены полные компиляторы C/C++ и среды разработки, это из-за того, что Sun ожидал, что большинство разработчиков будут использовать Java, больше, чем другие языки. Поскольку рынок внедренных сред весьма чувствителен к соотношению цены и производительности, что как раз не является сильной стороной Java, то для моей статьи о MAJC я подумал, что следует разобраться в этом несколько глубже.

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

Цели

Существует несколько причин, почему Java "исторически" медленнее, чем C (если сравнивать чистую производительность). Для начинающих в кратце - Java оптимизируется во время выполнения кода, а не во время компиляции, и при этом стандартные библиотеку должны работать одинаково на всех платформах, что требует дополнительного уровня программного обеспечения. Java еще и относительно новая технология - не забывайте, что прошло много времени, пока компиляторы C стали хороши (к тому же они и сейчас постоянно улучшаются) - и тоже самое было и с C++. На вершине производительности стоят всегда низкоуровневые программы, использующие маленькие библиотеки или не использующие их вовсе. На пути оптимизации есть несколько трудностей и в Java - любой доступ к массиву проверяется на легальность (с проверкой границ массива), стандартная строковая библиотека использует 16-bit Unicode вместо 8-bit ASCII, что означает, что все строки в два раза больше, все массивы должны быть инициализированы, динамическое распределение памяти работает через главный сборщик мусора, никакие мейнстримы центральных процессоров пока не используются ни в каких оптимизаторах, а так же имеются трудности с реализацией специфических мультимедийных инструкций. В теории, сборщик мусора и динамическая оптимизация могут быть преимуществом сами по себе, а большая часть трудностей, описанных выше, может быть оптимизирована хорошим оптимизатором - исключая 16-bit представление строк.

Эта статья не претендует на полное сравнение скорости работы Java и C, поскольку это не так-то уж и легко сделать.

Методы тестирования

Все тесты были запущены на моем персональном компьютере (Athlon 500 на Asus K7M МБ с 128MB PC100 SDRAM), с Windows 98SE - Windows в момент написания статьи была системой с наибольшим числом доступных современных JVM, так же, впрочем как и по выбору компиляторов C. Для каждой из программ, было произведено несколько запусков тестов с увеличением сложности или размера, кроме этого, каждый из тестов запускался 5 раз, самые большие и маленькие результаты отбрасывались, а конечным результатом было среднее, между оставшимися тремя. Для каждого теста было осуществлено два быстрых пробных теста для того, что бы определить, сколько нужно совершить циклов, что бы время работы программы было примерно равно 10 секундам, это нужно для того что бы уменьшить погрешность при измерении времени. 10-и секунд так же достаточно, что бы виртуальная машина полностью заоптимизировалась, так же в это время осуществляется само подстройка кода, для того, что бы он работал быстрее (оптимизация кода). Я не удовлетворен работой в Windows 98 таймера (точность), вычислительных потоков и многозадачности, обработкой прерываний (намного хуже, чем под Solaris, FreeBSD и Linux), но результаты в основном были предсказуемы и стабильны, и зачастую не было больших различий во всех пяти запусках.

Пояснение результатов тестирования: производительность дана относительно базового теста, а это программа на C откомпилированная с одной простой оптимизацией. Для каждого из тестов было произведена нормализация относительно 100 полученного из базового теста. Результат равный 110 должен быть быстрее на 10%, чем базовый тест, а результат в 90 должен быть на 10% медленнее. Другие тесты производились с компиляцией C с использованием более агрессивной оптимизацией, с использованием тех же правил, для всех остальных программ C. Ключи к графикам (легенда)

base-C Это версия программы на C скомпилированная с простой оптимизацией gcc (-O). Она - основа производительности, а все остальные результаты уже основываются на ней. Cygwin был использован для запуска GCC под Windows.
Версия: gcc version 2.95.2 19991024 (release)
Флаги оптимизации: -lm -O
max-C Эта версия на C с компиляцией с максимальной оптимизацией, отсюда она немного не стабильная. Поэтому я добавил немного более слабую версию, которая практически полностью безопасна, и всего только на 10% медленнее, но при этом вносится некая сумятица в графики. Версия gcc такая же, как и в базовом тесте.
Флаги оптимизации: ( -O3 -lm -s -static -fomit-frame-pointer -mpentiumpro -march=pentiumpro -malign-functions=4 -fu nroll-all-loops -fexpensive-optimizations -malign-double -fschedule-insns2 -mwide-multiply -finline-function s -fstrict-aliasing)
HotSpot Это программа на Java запускаемая на Sun HotSpot Server 2.0.
Версия: Java HotSpot(TM) Server VM (build 2.0fcs-E, mixed mode)
Флаги оптимизации: нет
IBM Это последняя версия Java от IBM 1.1.8, компилятора 3.5, от марта 2000. Это последний официальный релиз продукта, но я нашел версию 1.2.2, но поэтому я не уверен, будут ли различия для этих тестов с использованием разных JVM.
Версия: JDK 1.1.8 IBM build n118p-20000322 (JIT enabled: ibmjitc V3.5-IBMJDK1.1-20000322)
Флаги оптимизации: нет
MS C Microsoft Visual C компилятор с максимальной оптимизацией.
Версия: MSVC 6 Enterprise
Флаги оптимизации: "Maximum Optimizations" setting: /nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Release/fib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c

Алгоритмы тестирования

"Game of Life" с легкой загрузкой Это немного продвинутая реализация алгоритма J.H. Conway простой сотовой автоматизации - 2D набор ячеек, которые могут быть или живыми или мертвыми, смерть или жизнь зависит от количества соседних живых или мертвых ячеек. В этой версии все статично, и сильно зависит от доступа к массиву, а так же имеется фиксированное игровое поле с единственным "глидером" (повторяющийся шаблон с 5 живыми ячейками двигающимся по диагонали), поэтому, чем больше становится поле, тем больше алгоритм будет зависеть от простого чтения массива. Это наиболее длинный и сложный код из всех тестов.
"Game of Life" с сильной загрузкой Код идентичен предыдущему, но здесь количество глидеров зависит от размера поля, и их так много, как только возможно. При этом алгоритм уже меньше зависит от доступа к массиву.
"Game of Life" с безразмерным полем Это полностью другая реализация, использующая хеш для имитации разреженной матрицы, который в действительности же имеет максимальный размер 232x232. Эта реализация требует динамического распределения памяти и имеет уникальный алгоритм хеширования (для сохранения идентичности алгоритмов в разных языках) но он меньше и проще, чем версия со статической памятью. Для этого теста загрузка - квадратный блок глидеров, сильно сжатых, длинна каждой из сторон кратна 5. При этом алгоритм значительно медленнее, чем предыдущие.
Серии Fibonacci (см. стр2) Серии Фибоначи это очень простая функция, вызывающая себя рекурсивно дважды на каждой итерации (исключая заключительную итерацию) и вычисляющая время увеличения экспоненциально. Компилятору здесь не очень много чего есть что делать (ну только разве, что он может определить статическую натуру результатов) исключая инлайн и рекурсивных вызовов. Этот алгоритм представлен как альтернатива алгоритмам с массивами.
Простая реализация FFT (см. стр2) В этом тесте происходит множество быстрых преобразований Фурье, но с другой стороны он достаточно прост и содержит всего 4 процедуры с вложенными циклами. Поскольку в тесте используется двойная точность для работы с плавающей точкой, то он еще более отстранен от доступа к массивам.


C source | Java source

HotSpot и Microsoft C начали очень хорошо, но "сдулись" на больших массивах. Для HotSpot можно предположить, что он не оптимизирован для доступа к массивам (проверка границ), а дальнейшие тесты еще больше подтвердили это предположение. IBM JDK, как видно, очень хорошо оптимизирован для проверки границ массивов. Не очень понятно, почему упала производительность у Microsoft C.


C source | Java source
(Такие же, как и предыдущие, только запущены с аргументом '-heavy')

HotSpot здесь уже лучше оптимизирован, больше сделано реальных вычислений, но все таки остается достаточно много доступов к массивам. MSVC же так не облажался, как в предыдущих тестах.


C source | Java source

В этом тесте проявилось ясность относительно динамического распределения GCC, оно ограничено очень сильно. Поскольку доступ к массивам не так часто используется, то видно, что распределение памяти в HotSpot лучше, чем в IBM JVM. Оба JVM-а безусловно обгоняют GCC в этом тесте, только вот MSVC предотвращает чистую победу Java.

HotSpot неожиданно падает на 75/100, что объяснимо размерами пула памяти. Однако это можно изменить, при помощи недокументированных возможностей, которые можно посмотреть на этой странице. Если сделать его побольше (пул памяти), то тогда HotSpot не будет периодически падать так низко относительно других. К слову сказать, HotSpot в действительности делает это автоматически, но на это уходит драгоценное время, по крайней мере при этой методологии.


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте