Производительность Java
![]() | Эту статью необходимо обновить . Причина следующая: отсутствуют многие улучшения в Java 8, 11, 17, 21, .... ( ноябрь 2023 г. ) |
В разработке программного обеспечения язык программирования Java исторически считался более медленным, чем самые быстрые языки третьего поколения, типизированные такие как C и C++ . [1] В отличие от этих языков, Java по умолчанию компилируется в виртуальную машину Java (JVM) с операциями, отличными от операций реального компьютерного оборудования. Ранние реализации JVM представляли собой интерпретаторы ; они моделировали виртуальные операции одну за другой, а не переводили их в машинный код для прямого аппаратного выполнения.
С конца 1990-х годов скорость выполнения программ на Java значительно улучшилась за счет внедрения JIT- компиляции (в 1997 году для Java 1.1 ), [2] [3] [4] добавление языковых функций, поддерживающих лучший анализ кода, и оптимизацию JVM (например, HotSpot стал стандартным для Sun JVM в 2000 году). Сложные стратегии сбора мусора также нуждаются в улучшении. Аппаратное исполнение байт-кода Java, например, предлагаемое ARM Jazelle , изучалось, но не применялось.
Производительность , Java- программы скомпилированной с байт-кодом Java, зависит от того, насколько оптимально ее заданные задачи управляются виртуальной машиной Java использует возможности компьютерного оборудования и операционной системы хоста (JVM) и насколько хорошо JVM при этом (ОС). Таким образом, при любом тесте или сравнении производительности Java всегда необходимо указывать версию, поставщика, ОС и аппаратную архитектуру используемой JVM. Аналогичным образом производительность эквивалентной программы, скомпилированной в собственном коде, будет зависеть от качества сгенерированного ею машинного кода, поэтому при тестировании или сравнении также необходимо сообщать имя, версию и поставщика используемого компилятора, а также активированные оптимизации компилятора. директивы .
Методы оптимизации виртуальных машин
[ редактировать ]Многие оптимизации со временем улучшили производительность JVM. Однако, хотя Java часто была первой виртуальной машиной, успешно реализовавшей их, они часто использовались и на других подобных платформах.
Компиляция точно в срок
[ редактировать ]Ранние JVM всегда интерпретировали байт-коды Java . Это привело к значительному снижению производительности — от 10 до 20 раз для Java по сравнению с C в средних приложениях. [5] Чтобы бороться с этим, в Java 1.1 был введен JIT-компилятор. Из-за высокой стоимости компиляции в Java 1.2 была введена дополнительная система под названием HotSpot , которая стала системой по умолчанию в Java 1.3. Используя эту структуру, виртуальная машина Java постоянно анализирует производительность программы на наличие горячих точек , которые выполняются часто или неоднократно. Затем они направляются на оптимизацию , что приводит к высокопроизводительному выполнению с минимальными накладными расходами для менее критичного к производительности кода. [6] [7] Некоторые тесты показывают 10-кратный прирост скорости благодаря этому. [8] Однако из-за нехватки времени компилятор не может полностью оптимизировать программу, и поэтому полученная программа работает медленнее, чем альтернативы с собственным кодом. [9] [10]
Адаптивная оптимизация
[ редактировать ]Адаптивная оптимизация — это метод в информатике, который выполняет динамическую перекомпиляцию частей программы на основе текущего профиля выполнения. При простой реализации адаптивный оптимизатор может просто найти компромисс между своевременной компиляцией и интерпретацией инструкций. На другом уровне адаптивная оптимизация может использовать условия локальных данных для оптимизации удаленных ветвей и использования встроенного расширения.
Виртуальная машина Java, такая как HotSpot, также может деоптимизировать код, который ранее был JIT-компилятором. Это позволяет выполнять агрессивную (и потенциально небезопасную) оптимизацию, сохраняя при этом возможность позже деоптимизировать код и вернуться на безопасный путь. [11] [12]
Сбор мусора
[ редактировать ](JVM) версий 1.0 и 1.1 Виртуальные машины Java использовали сборщик пометок и очистки , который мог фрагментировать кучу после сборки мусора. Начиная с Java 1.2, JVM изменились на сборщик поколений , который имеет гораздо лучшее поведение при дефрагментации. [13] Современные JVM используют множество методов, которые еще больше повышают производительность сборки мусора . [14]
Другие методы оптимизации
[ редактировать ]Сжатый
[ редактировать ]Сжатые Oops позволяют Java 5.0+ адресовать до 32 ГБ кучи с 32-битными ссылками. Java не поддерживает доступ к отдельным байтам, а только к объектам, которые по умолчанию выровнены по 8 байтам. По этой причине младшие 3 бита ссылки на кучу всегда будут равны 0. Уменьшив разрешение 32-битных ссылок до 8-байтовых блоков, адресное пространство можно увеличить до 32 ГБ. Это значительно снижает использование памяти по сравнению с использованием 64-битных ссылок, поскольку Java использует ссылок гораздо больше, чем некоторые языки, такие как C++. Java 8 поддерживает более крупные выравнивания, такие как выравнивание по 16 байтам, для поддержки до 64 ГБ с 32-битными ссылками. [ нужна ссылка ]
Проверка разделенного байт-кода
[ редактировать ]Перед выполнением класса Sun JVM проверяет его байт-коды Java (см. средство проверки байт-кода ). Эта проверка выполняется лениво: байт-коды классов загружаются и проверяются только тогда, когда конкретный класс загружается и готовится к использованию, а не в начале программы. Java Однако, поскольку библиотеки классов также являются обычными классами Java, их также необходимо загружать при использовании, а это означает, что время запуска программы Java часто больше, чем C++ , например, для программ .
Метод под названием «Промежуточная проверка» , впервые представленный в платформе Java Micro Edition (J2ME), используется в JVM начиная с версии Java 6 . Он разделяет проверку байт-кода Java на два этапа: [15]
- Время разработки — при компиляции класса из исходного кода в байт-код.
- Время выполнения – при загрузке класса.
На практике этот метод работает путем сбора знаний, имеющихся у компилятора Java о потоке классов, и аннотирования байт-кодов скомпилированного метода кратким описанием информации о потоке классов. Это не делает проверку во время выполнения заметно менее сложной, но позволяет использовать некоторые упрощения. [ нужна ссылка ]
Анализ побегов и укрупнение замков
[ редактировать ]Java может управлять многопоточностью на уровне языка. Многопоточность позволяет программам выполнять несколько процессов одновременно, тем самым повышая производительность программ, работающих на компьютерных системах с несколькими процессорами или ядрами. Кроме того, многопоточное приложение может реагировать на вводимые данные даже при выполнении длительных задач.
Однако программам, использующим многопоточность, необходимо уделять особое внимание объектам, совместно используемым между потоками, блокируя доступ к общим методам или блокам , когда они используются одним из потоков. Блокировка блока или объекта — трудоемкая операция из-за особенностей базовой операции на уровне операционной системы (см. управление параллелизмом и степень детализации блокировки ).
Поскольку библиотека Java не знает, какие методы будут использоваться более чем одним потоком, стандартная библиотека всегда блокирует блоки , когда это необходимо в многопоточной среде.
До Java 6 виртуальная машина всегда блокировала объекты и блоки по запросу программы, даже если не было риска изменения объекта двумя разными потоками одновременно. Например, в данном случае местный Vector
был заблокирован перед каждой операцией добавления , чтобы гарантировать, что он не будет изменен другими потоками ( Vector
синхронизируется), но поскольку он является строго локальным для метода, в этом нет необходимости:
public String getNames() {
final Vector<String> v = new Vector<>();
v.add("Me");
v.add("You");
v.add("Her");
return v.toString();
}
Начиная с Java 6, блоки кода и объекты блокируются только при необходимости. [16] поэтому в приведенном выше случае виртуальная машина вообще не будет блокировать объект Vector.
Начиная с версии 6u23, Java включает поддержку escape-анализа. [17]
Улучшения распределения регистров
[ редактировать ]До Java 6 распределение регистров в клиентской виртуальной машине было очень примитивным (они не размещались в блоках ), что было проблемой в конструкциях ЦП , в которых было меньше доступных регистров процессора , как в x86 . Если для операции больше нет доступных регистров, компилятор должен скопировать данные из регистра в память (или из памяти в регистр), что требует времени (доступ к регистрам происходит значительно быстрее). Однако виртуальная машина сервера использовала распределитель цветных графиков и не имела этой проблемы.
Оптимизация распределения регистров была представлена в Sun JDK 6; [18] тогда можно было использовать одни и те же регистры в разных блоках (если это применимо), уменьшая доступ к памяти. Это привело к заявленному приросту производительности примерно на 60% в некоторых тестах. [19]
Обмен данными класса
[ редактировать ]Совместное использование данных классов (называемое Sun CDS) — это механизм, который сокращает время запуска Java-приложений, а также уменьшает объем памяти . Когда JRE установлена, программа установки загружает набор классов из системного файла JAR (файл JAR, содержащий всю библиотеку классов Java, называемый rt.jar) в частное внутреннее представление и выгружает это представление в файл, называемый «общий архив». Во время последующих вызовов JVM этот общий архив отображается в памяти JVM для этих классов между несколькими процессами JVM. большую часть метаданных , что экономит затраты на загрузку этих классов и позволяет совместно использовать [20]
Соответствующее улучшение времени запуска более очевидно для небольших программ. [21]
История улучшений производительности
[ редактировать ]![]() | Этот раздел необходимо обновить . Причина такова: последней версии, упомянутой в этом разделе, Java 7, уже больше десяти лет; на момент написания текущей версией является Java 20. ( апрель 2023 г. ) |
Помимо перечисленных здесь улучшений, в каждом выпуске Java было представлено множество улучшений производительности JVM и интерфейса программирования приложений (API) Java.
JDK 1.1.6: Первая своевременная компиляция ( ) JIT-компилятор Symantec [2] [22]
J2SE 1.2: Использование сборщика поколений .
J2SE 1.3: Своевременная компиляция с помощью HotSpot .
J2SE 1.4: См . здесь обзор улучшений производительности Sun между версиями 1.3 и 1.4.
Java SE 5.0: совместное использование данных классов [23]
Ява ЮВ 6:
- Проверка разделенного байт-кода
- Анализ побегов и укрупнение замков
- Улучшения распределения регистров
Другие улучшения:
- Java OpenGL Java 2D Улучшение скорости конвейера [24]
- Производительность Java 2D также значительно улучшилась в Java 6. [25]
См. также «Обзор Sun по улучшению производительности между Java 5 и Java 6». [26]
Java SE 6, обновление 10
[ редактировать ]- Java Quick Starter сокращает время запуска приложения за счет предварительной загрузки части данных JRE при запуске ОС в дисковый кэш . [27]
- Части платформы, необходимые для выполнения приложения, доступ к которому осуществляется из Интернета, когда JRE не установлена, теперь загружаются в первую очередь. Полная версия JRE занимает 12 МБ, типичному приложению Swing для запуска требуется загрузить только 4 МБ. Остальные части затем загружаются в фоновом режиме. [28]
- Производительность графики в Windows улучшена за счет широкого использования Direct3D по умолчанию. [29] и используйте шейдеры на графическом процессоре (GPU) для ускорения сложных 2D-операций Java . [30]
Ява 7
[ редактировать ]Для Java 7 было выпущено несколько улучшений производительности: Будущие улучшения производительности запланированы для обновления Java 6 или Java 7: [31]
- Обеспечить поддержку JVM для динамических языков программирования после работы по созданию прототипов, выполняемой в настоящее время на машине Da Vinci (многоязычная виртуальная машина), [32]
- Расширьте существующую библиотеку параллелизма за счет управления параллельными вычислениями на многоядерных процессорах. [33] [34]
- Разрешите JVM использовать как клиентский , так и серверный JIT-компиляторы в одном сеансе с помощью метода, называемого многоуровневой компиляцией: [35]
- Клиент , будет использоваться при запуске (потому что он хорош при запуске и для небольших приложений)
- Сервер клиентский будет использоваться для долгосрочной работы приложения (поскольку в этом отношении он превосходит компилятор ).
- Замените существующий параллельный сборщик мусора с низкой паузой (также называемый сборщиком параллельной разметки (CMS)) новым сборщиком под названием Garbage First (G1), чтобы обеспечить постоянные паузы с течением времени. [36] [37]
Сравнение с другими языками
[ редактировать ]Для объективного сравнения производительности программы Java и эквивалентной программы, написанной на другом языке, например C++, требуется тщательно и продуманно построенный тест, который сравнивает программы, выполняющие идентичные задачи. Целевой платформой Java компилятора байт-кода является платформа Java , а байт-код либо интерпретируется, либо компилируется в машинный код с помощью JVM. Другие компиляторы почти всегда ориентированы на конкретную аппаратную и программную платформу, создавая машинный код, который практически не изменяется во время выполнения. [ нужна ссылка ] . В результате этих двух разных подходов возникают совершенно разные и трудно сравнимые сценарии: статическая и динамическая компиляция и перекомпиляция , наличие точной информации о среде выполнения и другие.
Java часто «точно в срок» Java компилируется виртуальной машиной во время выполнения , но также может быть скомпилирована заранее , как и C++. При своевременной компиляции микротесты The Computer Language Benchmarks Game показывают следующее о ее производительности: [38]
- медленнее, чем компилируемые языки, такие как C или C++ , [39]
- аналогично другим языкам, компилируемым точно в срок, таким как C# , [40]
- намного быстрее, чем языки без эффективного компилятора собственного кода ( JIT или AOT ), такие как Perl , Ruby , PHP и Python . [41]
Скорость программы
[ редактировать ]Бенчмарки часто измеряют производительность небольших программ с большим числом вычислений. В некоторых редких реальных программах Java превосходит C. Одним из примеров является тест Jake2 (клон Quake II , написанный на Java путем перевода исходного кода C GPL ). Версия Java 5.0 работает лучше в некоторых конфигурациях оборудования, чем ее аналог C. [42] Хотя не уточняется, как были измерены данные (например, использовался ли исходный исполняемый файл Quake II, скомпилированный в 1997 году, что можно считать плохим, поскольку текущие компиляторы C могут обеспечить лучшую оптимизацию для Quake), в нем отмечается, что тот же исходный код Java можно получить огромный прирост скорости, просто обновив виртуальную машину, чего невозможно достичь при 100% статическом подходе.
Что касается других программ, аналог C++ может работать и обычно работает значительно быстрее, чем эквивалент Java. Тест, проведенный Google в 2011 году, показал разницу в 10 раз между C++ и Java. [43] С другой стороны, академический тест, проведенный в 2012 году с использованием алгоритма 3D-моделирования, показал, что JVM Java 6 от 1,09 до 1,91 раз медленнее, чем C++ под Windows. [44]
Некоторые оптимизации, возможные в Java и подобных языках, при определенных обстоятельствах могут быть невозможны в C++: [45]
- в стиле C Использование указателей может затруднить оптимизацию в языках, поддерживающих указатели.
- Использование методов escape-анализа ограничено в C++ , например, потому, что компилятор C++ не всегда знает, будет ли объект изменен в данном блоке кода из-за указателей . [примечание 1]
- Java может получить доступ к производным методам экземпляра быстрее, чем C++ может получить доступ к производным виртуальным методам, благодаря дополнительному поиску в виртуальной таблице C++. Однако невиртуальные методы в C++ не страдают от узких мест в производительности v-таблиц и, таким образом, демонстрируют производительность, аналогичную Java.
JVM также способна выполнять оптимизацию для конкретного процессора или оперативное расширение . А возможность деоптимизировать уже скомпилированный или встроенный код иногда позволяет ему выполнять более агрессивную оптимизацию, чем та, которую выполняют статически типизированные языки, когда задействованы внешние библиотечные функции. [46] [47]
Результаты микротестов Java и C++ во многом зависят от того, какие операции сравниваются. Например, при сравнении с Java 5.0:
- 32- и 64-битные арифметические операции, [48] [49] ввод/вывод файла , [50] и обработка исключений [51] иметь аналогичную производительность с сопоставимыми программами на C++
- Операции с массивами [52] иметь лучшую производительность в C.
- Производительность тригонометрических функций намного лучше в C. [53]
- Примечания
- ^ Разногласия такого характера можно смягчить в программах на C++ на уровне исходного кода, используя передовые методы, такие как пользовательские распределители , используя именно тот вид сложности кодирования низкого уровня, для сокрытия и инкапсуляции которого был разработан Java; однако этот подход редко бывает практичным, если его не принять (или, по крайней мере, не предвидеть), пока программа находится на начальной стадии разработки.
Многоядерная производительность
[ редактировать ]Масштабируемость и производительность приложений Java в многоядерных системах ограничены скоростью выделения объектов. Этот эффект иногда называют «стеной распределения». [54] Однако на практике современные алгоритмы сборщика мусора используют для выполнения сборки мусора несколько ядер, что в некоторой степени смягчает эту проблему. Сообщается, что некоторые сборщики мусора поддерживают скорость выделения более гигабайта в секунду. [55] и существуют системы на базе Java, которые без проблем масштабируются до нескольких сотен ядер ЦП и кучи размером в несколько сотен ГБ. [56]
Автоматическое управление памятью в Java позволяет эффективно использовать незапираемые и неизменяемые структуры данных, которые чрезвычайно сложно, а иногда и невозможно реализовать без какой-либо сборки мусора. [ нужна ссылка ] Java предлагает ряд таких высокоуровневых структур в своей стандартной библиотеке в пакете java.util.concurrent, в то время как во многих языках, исторически использовавшихся для высокопроизводительных систем, таких как C или C++, они до сих пор отсутствуют. [ нужна ссылка ]
Время запуска
[ редактировать ]Время запуска Java часто намного медленнее, чем у многих языков, включая C , C++ , Perl или Python , поскольку многие классы (и в первую очередь классы из библиотек классов платформы ) должны быть загружены перед использованием.
По сравнению с аналогичными популярными средами выполнения для небольших программ, работающих на компьютере под управлением Windows, время запуска похоже на время запуска Mono и немного медленнее, чем у .NET . [57]
Похоже, что большая часть времени запуска связана с операциями ввода-вывода (IO), а не с инициализацией JVM или загрузкой классов ( один только файл данных класса rt.jar имеет размер 40 МБ, и JVM должна искать много данных в этом большом файле). . [27] Некоторые тесты показали, что, хотя новый метод проверки разделенного байт-кода улучшил загрузку классов примерно на 40%, он реализовал запуск только на 5%. улучшение для больших программ. [58]
Хотя это небольшое улучшение, оно более заметно в небольших программах, которые выполняют простую операцию и затем завершают работу, поскольку загрузка данных платформы Java может во много раз превышать нагрузку фактической операции программы.
Начиная с Java SE 6 Update 10, Sun JRE поставляется с Quick Starter, который предварительно загружает данные классов при запуске ОС, чтобы получить данные из дискового кэша, а не с диска.
Excelsior JET подходит к проблеме с другой стороны. Его оптимизатор запуска уменьшает объем данных, которые необходимо прочитать с диска при запуске приложения, и делает чтение более последовательным.
В ноябре 2004 года был публично выпущен Nailgun , «клиент, протокол и сервер для запуска Java-программ из командной строки без затрат на запуск JVM». [59] впервые представила возможность сценариям использовать JVM в качестве демона для запуска одного или нескольких приложений Java без затрат на запуск JVM. Демон Nailgun небезопасен: «все программы запускаются с теми же разрешениями, что и сервер». Там, где многопользовательская необходима безопасность, Nailgun не подходит без специальных мер предосторожности. Сценарии, в которых запуск JVM для каждого приложения доминирует над использованием ресурсов, обеспечивают на один-два порядка . повышение производительности во время выполнения [60]
Использование памяти
[ редактировать ]![]() | этого раздела Фактическая точность оспаривается . ( Август 2019 г. ) |
Использование памяти Java намного выше, чем использование памяти C++, потому что:
- Накладные расходы составляют 8 байт для каждого объекта и 12 байт для каждого массива. [61] на Яве. Если размер объекта не кратен 8 байтам, он округляется до следующего числа, кратного 8. Это означает, что объект, содержащий однобайтовое поле, занимает 16 байт и нуждается в 4-байтовой ссылке. C++ также выделяет указатель (обычно 4 или 8 байт) для каждого объекта, класс которого прямо или косвенно объявляет виртуальные функции . [62]
- Отсутствие адресной арифметики делает создание контейнеров с эффективным использованием памяти, таких как плотно расположенные структуры и связанные списки XOR , в настоящее время невозможным ( проект OpenJDK Valhalla направлен на смягчение этих проблем, хотя он и не преследует цели внедрения арифметики указателей; это невозможно сделать в среда для сбора мусора).
- В отличие от malloc и new, средние издержки производительности при сборке мусора асимптотически приближаются к нулю (точнее, к одному циклу ЦП) по мере увеличения размера кучи. [63]
- Части библиотеки классов Java должны загружаться перед выполнением программы (по крайней мере, классы, используемые в программе). [64] Это приводит к значительным затратам памяти для небольших приложений. [ нужна ссылка ]
- Как двоичные файлы Java, так и собственные перекомпиляции обычно находятся в памяти.
- Виртуальная машина использует значительный объем памяти.
- В Java составной объект (класс A, который использует экземпляры B и C) создается с использованием ссылок на выделенные экземпляры B и C. В C++ можно избежать затрат памяти и производительности для этих типов ссылок, когда экземпляр B и C /или C существует внутри A.
В большинстве случаев приложение C++ будет потреблять меньше памяти, чем эквивалентное приложение Java, из-за больших затрат виртуальной машины Java, загрузки классов и автоматического изменения размера памяти. Для программ, в которых память является решающим фактором при выборе между языками и средами выполнения, необходим анализ затрат и выгод.
Тригонометрические функции
[ редактировать ]Производительность тригонометрических функций плохая по сравнению с C, поскольку Java имеет строгие спецификации результатов математических операций, которые могут не соответствовать базовой аппаратной реализации. [65] В подмножестве x87 с плавающей запятой Java, начиная с версии 1.4, выполняет сокращение аргументов для sin и cos в программном обеспечении, [66] что приводит к значительному снижению производительности для значений, выходящих за пределы диапазона. [67] [ нужны разъяснения ]
Собственный интерфейс Java
[ редактировать ]требует Собственный интерфейс Java больших затрат, что делает пересечение границы между кодом, выполняемым на JVM, и собственным кодом дорогостоящим. [68] [69] [70] Java Native Access (JNA) обеспечивает программам Java легкий доступ к собственным общим библиотекам ( динамически подключаемым библиотекам (DLL) в Windows) только через код Java, без использования JNI или собственного кода. Эта функциональность сравнима с Windows Platform/Invoke и ctypes Python . Доступ является динамическим во время выполнения без генерации кода. Но у этого есть своя цена: JNA обычно медленнее, чем JNI. [71]
Пользовательский интерфейс
[ редактировать ]Swing считается более медленным, чем собственные наборы инструментов для виджетов , поскольку он делегирует рендеринг виджетов чистому Java 2D API . Однако тесты, сравнивающие производительность Swing и Standard Widget Toolkit , который делегирует рендеринг собственным библиотекам графического интерфейса операционной системы, не выявили явного победителя, а результаты сильно зависят от контекста и среды. [72] Кроме того, новая платформа JavaFX , призванная заменить Swing, решает многие присущие Swing проблемы.
Использование для высокопроизводительных вычислений
[ редактировать ]Некоторые люди считают, что производительность Java для высокопроизводительных вычислений (HPC) аналогична производительности Fortran в тестах с интенсивными вычислениями, но у JVM все еще есть проблемы с масштабируемостью для выполнения интенсивного обмена данными в сети распределенных вычислений . [73]
Однако приложения для высокопроизводительных вычислений, написанные на Java, выиграли соревнования по тестированию производительности. В 2008 году [74] и 2009 г., [75] [76] Кластер на базе Apache Hadoop (проект высокопроизводительных вычислений с открытым исходным кодом, написанный на Java) смог быстрее всех отсортировать терабайты и петабайты целых чисел. Однако аппаратная настройка конкурирующих систем не была исправлена. [77] [78]
В конкурсах по программированию
[ редактировать ]Программы на Java запускаются медленнее, чем программы на других компилируемых языках. [79] [80] Таким образом, некоторые онлайн-системы судейства, особенно те, которые размещены в китайских университетах, используют более длительные сроки для программ Java. [81] [82] [83] [84] [85] быть справедливым по отношению к участникам, использующим Java.
См. также
[ редактировать ]- Общеязыковая среда выполнения
- Анализ производительности
- Java-процессор — встроенный процессор, выполняющий собственный байт-код Java (например, JStik ).
- Сравнение Java и C++
- Java ConcurrentMap
Цитаты
[ редактировать ]- ^ «Бенчмарки Java и C++» .
- ^ Jump up to: а б «Just-In-Time Java-компилятор Symantec будет интегрирован в Sun JDK 1.1» . Архивировано из оригинала 28 июня 2010 года.
- ^ «Краткий обзор: Apple лицензирует компилятор Symantec «точно в срок»» . cnet.com. 12 мая 1998 года . Проверено 15 ноября 2015 г.
- ^ «Java становится в четыре раза быстрее с новым JIT-компилятором Symantec» .
- ^ «Сравнение производительности сред выполнения Java/.NET (октябрь 2004 г.)» .
- ^ Кавагути, Косуке (30 марта 2008 г.). «Глубокое погружение в ассемблерный код Java» . Архивировано из оригинала 2 апреля 2008 года . Проверено 2 апреля 2008 г.
- ^ «Быстрая и эффективная генерация кода с помощью JIT-компилятора Java» (PDF) . Корпорация Интел . Проверено 22 июня 2007 г.
- ^ В этой статье показано, что прирост производительности между интерпретируемым режимом и Hotspot составляет более 10 раз.
- ^ Числовая производительность в C, C# и Java
- ^ Алгоритмическое сравнение производительности языков программирования C, C++, Java и C#. Архивировано 31 марта 2010 г., на Wayback Machine.
- ^ «Виртуальная машина Java HotSpot, v1.4.1» . Сан Микросистемс . Проверено 20 апреля 2008 г.
- ^ Наттер, Чарльз (28 января 2008 г.). «Lang.NET 2008: Мысли первого дня» . Проверено 18 января 2011 г.
Деоптимизация очень интересна при решении проблем с производительностью, поскольку она означает, что вы можете проводить гораздо более агрессивную оптимизацию... зная, что позже вы сможете вернуться к проверенному и действительно безопасному пути.
- ^ Библиотека IBM DeveloperWorks
- ^ Например, продолжительность пауз теперь менее заметна. См., например, этот клон Quake II, написанный на Java: Jake2 .
- ^ «Новая функция Java SE 6: средство проверки типов» . Java.net . Проверено 18 января 2011 г. [ постоянная мертвая ссылка ]
- ^ Брайан Гетц (18 октября 2005 г.). «Теория и практика Java: оптимизация синхронизации в Mustang» . ИБМ . Проверено 26 января 2013 г.
- ^ «Повышение производительности виртуальной машины Java HotSpot» . Корпорация Оракл . Проверено 14 января 2014 г.
Escape-анализ — это метод, с помощью которого компилятор сервера Java Hotspot может анализировать область использования нового объекта и решать, размещать ли его в куче Java. Escape-анализ поддерживается и включен по умолчанию в Java SE 6u23 и более поздних версиях.
- ^ Отчет об ошибке: новый распределитель регистров, исправленный в Mustang (JDK 6) b59.
- ^ Клиент HotSpot Mustang работает на 58% быстрее! Архивировано 5 марта 2012 года в Wayback Machine в блоге Освальдо Пинали Додерляйна на java.net.
- ^ Совместное использование данных классов на java.sun.com
- ^ Совместное использование данных классов в JDK 1.5.0 на форуме Java Buzz. у разработчика Артимы
- ^ Маккей, Ниали. «Java становится в четыре раза быстрее с новым JIT-компилятором Symantec» .
- ^ Обзор Sun улучшений производительности между версиями 1.4 и 5.0.
- ^ STR-Crazier: Улучшения производительности в Mustang. Архивировано 5 января 2007 г. в Wayback Machine в блоге Криса Кэмпбелла на java.net.
- ^ См. здесь тест, показывающий повышение производительности примерно на 60% от Java 5.0 до 6 для приложения JFreeChart.
- ^ Технический документ по производительности Java SE 6 на http://java.sun.com
- ^ Jump up to: а б Хаазе, Чет (май 2007 г.). «Потребительская JRE: более экономичная, более эффективная технология Java» . Сан Микросистемс . Проверено 27 июля 2007 г.
На уровне ОС все эти мегабайты приходится считывать с диска, а это очень медленная операция. На самом деле, убийцей является время поиска диска; последовательное чтение больших файлов происходит относительно быстро, но поиск тех битов, которые нам действительно нужны, — нет. Таким образом, хотя нам нужна лишь небольшая часть данных в этих больших файлах для любого конкретного приложения, тот факт, что мы ищем все внутри файлов, означает, что на диске много активности.
- ^ Хаазе, Чет (май 2007 г.). «Потребительская JRE: более экономичная, более эффективная технология Java» . Сан Микросистемс . Проверено 27 июля 2007 г.
- ^ Хаазе, Чет (май 2007 г.). «Потребительская JRE: более экономичная, более эффективная технология Java» . Сан Микросистемс . Проверено 27 июля 2007 г.
- ^ Кэмпбелл, Крис (7 апреля 2007 г.). «Быстрее Java 2D с помощью шейдеров» . Архивировано из оригинала 5 июня 2011 года . Проверено 18 января 2011 г.
- ^ Хаазе, Чет (май 2007 г.). «Потребительская JRE: более экономичная, более эффективная технология Java» . Сан Микросистемс . Проверено 27 июля 2007 г.
- ^ «JSR 292: Поддержка динамически типизированных языков на платформе Java» . jcp.org . Проверено 28 мая 2008 г.
- ^ Гетц, Брайан (4 марта 2008 г.). «Теория и практика Java: воткни вилку, часть 2» . ИБМ . Проверено 9 марта 2008 г.
- ^ Лоример, Р.Дж. (21 марта 2008 г.). «Параллелизм с Fork/Join в Java 7» . infoq.com . Проверено 28 мая 2008 г.
- ^ «Новые оптимизации компилятора в виртуальной машине Java HotSpot» (PDF) . Сан Микросистемс. Май 2006 года . Проверено 30 мая 2008 г.
- ^ Скромный, Чарльз (13 мая 2008 г.). «JavaOne: мусор прежде всего» . infoq.com . Проверено 7 сентября 2008 г.
- ^ Трус, Дэнни (12 ноября 2008 г.). «Java VM: пробуем новый сборщик мусора для JDK 7» . Архивировано из оригинала 8 декабря 2011 года . Проверено 15 ноября 2008 г.
- ^ «Игра с тестами компьютерного языка» . тестыgame.alioth.debian.org. Архивировано из оригинала 25 января 2015 года . Проверено 2 июня 2011 г.
- ^ «Игра с тестами компьютерного языка» . тестыgame.alioth.debian.org. Архивировано из оригинала 13 января 2015 года . Проверено 2 июня 2011 г.
- ^ «Игра с тестами компьютерного языка» . тестыgame.alioth.debian.org. Архивировано из оригинала 10 января 2015 года . Проверено 2 июня 2011 г.
- ^ «Игра с тестами компьютерного языка» . тестыgame.alioth.debian.org. Архивировано из оригинала 2 января 2015 года . Проверено 2 июня 2011 г.
- ^ : 260/250 кадров/с против 245 кадров/с (см. тест )
- ^ Хундт, Роберт. «Распознавание циклов в C++/Java/Go/Scala» (PDF) . Дни Скалы 2011 . Стэнфорд, Калифорния . Проверено 23 марта 2014 г.
- ^ Л. Герарди; Д. Бругали; Д. Комотти (2012). «Оценка производительности Java и C++: тест 3D-моделирования» (PDF) . Университет Бергамо . Проверено 23 марта 2014 г.
Использование серверного компилятора, который лучше всего настроен для длительных приложений, вместо этого продемонстрировало, что Java работает в 1,09–1,91 раза медленнее (...). В заключение, результаты, полученные с помощью серверного компилятора, и эти важные функции позволяют предположить, что Java может считаться допустимой альтернативой C++
- ^ Льюис, JP; Нойманн, Ульрих. «Производительность Java по сравнению с C++» . Лаборатория компьютерной графики и иммерсивных технологий, Университет Южной Калифорнии.
- ^ «Механизм производительности Java HotSpot: пример встраивания метода» . Корпорация Оракл . Проверено 11 июня 2011 г.
- ^ Наттер, Чарльз (3 мая 2008 г.). «Сила JVM» . Проверено 11 июня 2011 г.
Что произойдет, если вы уже встроили метод A, когда появится B? И здесь JVM блистает. Поскольку JVM, по сути, представляет собой скрытую динамическую среду выполнения языка, она всегда бдительна, отслеживая именно такие события. И вот что самое интересное: когда ситуация меняется, JVM может деоптимизироваться. Это важная деталь. Многие другие среды выполнения могут выполнять оптимизацию только один раз. Компиляторы C должны сделать все это заранее, во время сборки. Некоторые позволяют вам профилировать ваше приложение и использовать его в последующих сборках, но как только вы выпустите фрагмент кода, он, по сути, будет максимально оптимизирован. В других системах, подобных VM, таких как CLR, есть фаза JIT, но она происходит на ранних этапах выполнения (возможно, еще до того, как система начнет выполняться) и больше никогда не повторяется. Способность JVM деоптимизировать и вернуться к интерпретации дает ей возможность быть оптимистом... возможность делать амбициозные предположения и изящно возвращаться в безопасное состояние, чтобы повторить попытку позже.
- ^ «Микробенчмаркинг C++, C# и Java: 32-битная целочисленная арифметика» . Журнал доктора Добба . 1 июля 2005 года . Проверено 18 января 2011 г.
- ^ «Микробенчмаркинг C++, C# и Java: 64-битная двойная арифметика» . Журнал доктора Добба . 1 июля 2005 года . Проверено 18 января 2011 г.
- ^ «Микробенчмаркинг C++, C# и Java: файловый ввод-вывод» . Журнал доктора Добба . 1 июля 2005 года . Проверено 18 января 2011 г.
- ^ «Микробенчмаркинг C++, C# и Java: исключение» . Журнал доктора Добба . 1 июля 2005 года . Проверено 18 января 2011 г.
- ^ «Микробенчмаркинг C++, C# и Java: массив» . Журнал доктора Добба . 1 июля 2005 года . Проверено 18 января 2011 г.
- ^ «Микробенчмаркинг C++, C# и Java: тригонометрические функции» . Журнал доктора Добба . 1 июля 2005 года . Проверено 18 января 2011 г.
- ^ И Чжао, Цзинь Ши, Кай Чжэн, Хайчуань Ван, Хайбо Линь и Лин Шао, Стена распределения: ограничивающий фактор приложений Java на новых многоядерных платформах , Материалы 24-й конференции ACM SIGPLAN по языкам и приложениям объектно-ориентированных систем программирования , 2009.
- ^ C4: Коллектор непрерывного одновременного сжатия
- ^ Азул издевается над Java с помощью 768-ядерной машины
- ^ «Оценка запуска и производительности системы для .Net, Mono, Java, C++ и их соответствующего пользовательского интерфейса» . 2 сентября 2010 г.
- ^ «Как быстро работает новый верификатор?» . 7 февраля 2006 г. Архивировано из оригинала 16 мая 2006 г. Проверено 9 мая 2007 г.
- ^ Гвоздемет
- ^ о гвоздемете» Страница «Фоновая информация демонстрирует ускорение « в лучшем случае » в 33 раза (для программ «Hello, World!», написанных по сценарию , т. е. краткосрочных программ).
- ^ «Как рассчитать использование памяти объектами Java» .
- ^ «InformIT: Справочное руководство по C++ > Объектная модель» . Архивировано из оригинала 21 февраля 2008 года . Проверено 22 июня 2009 г.
- ^ https://www.youtube.com/watch?v=M91w0SBZ-wc : Понимание сборки мусора Java - доклад Гила Тене на JavaOne
- ^ ".: ToMMTi-Systems :: За кулисами современного 3D-оборудования" .
- ^ «Математика (платформа Java SE 6)» . Сан Микросистемс . Проверено 8 июня 2008 г.
- ^ Гослинг, Джеймс (27 июля 2005 г.). «Трансцендентальная медитация» . Архивировано из оригинала 12 августа 2011 года . Проверено 8 июня 2008 г.
- ^ Коуэлл-Шах, Кристофер В. (8 января 2004 г.). «Обзор производительности девяти языков: сравнительный анализ математических вычислений и файлового ввода-вывода» . Архивировано из оригинала 11 октября 2018 года . Проверено 8 июня 2008 г.
- ^ Уилсон, Стив; Джефф Кессельман (2001). «Производительность платформы JavaTM: использование собственного кода» . Сан Микросистемс . Проверено 15 февраля 2008 г.
- ^ Куржинец, Давид; Вайди Сундерам. «Эффективное взаимодействие между Java и собственным кодом — тест производительности JNI» (PDF) . Архивировано из оригинала (PDF) 14 февраля 2005 года . Проверено 15 февраля 2008 г.
- ^ Блох 2018 , с. 285, Глава §11, пункт 66. Разумно используйте собственные методы.
- ^ «Как производительность JNA отличается от пользовательского JNI?» . Сан Микросистемс . Проверено 26 декабря 2009 г. [ постоянная мертвая ссылка ]
- ^ Игорь, Крижнар (10 мая 2005 г.). «Сравнение производительности SWT и Swing» (PDF) . cosylab.com. Архивировано из оригинала (PDF) 4 июля 2008 года . Проверено 24 мая 2008 г.
Трудно дать эмпирическое правило, согласно которому SWT превзойдет Swing или наоборот. В некоторых средах (например, Windows) SWT является победителем. В других (Linux, VMware, хостинг Windows) Swing и его оптимизация перерисовки значительно превосходят SWT. Различия в производительности значительны: часто встречаются коэффициенты 2 и более в обе стороны.
- ^ Брайан Амедро; Владимир Боднарчук; Денис Каромель; Кристиан Дельбе; Фабрис Юэ; Гильермо Л. Табоада (август 2008 г.). «Текущее состояние Java для HPC» . ИНРИА . Проверено 9 сентября 2008 г.
Сначала мы проведем несколько микротестов для различных JVM, показав общую хорошую производительность основных арифметических операций (...). Сравнивая эту реализацию с реализацией Fortran/MPI, мы показываем, что они имеют одинаковую производительность в тестах с интенсивными вычислениями, но все еще имеют проблемы с масштабируемостью при выполнении интенсивных коммуникаций.
- ^ Оуэн О'Мэлли - Yahoo! Группа Grid-вычислений (июль 2008 г.). «Apache Hadoop побеждает в тесте терабайтной сортировки» . Архивировано из оригинала 15 октября 2009 года . Проверено 21 декабря 2008 г.
Это первый случай, когда победу одержала либо Java, либо программа с открытым исходным кодом.
- ^ «Hadoop сортирует петабайт за 16,25 часов и терабайт за 62 секунды» . CNET.com . 11 мая 2009 года. Архивировано из оригинала 16 мая 2009 года . Проверено 8 сентября 2010 г.
Сведения об оборудовании и операционной системе: (...)Sun Java JDK (1.6.0_05-b13 и 1.6.0_13-b03) (32- и 64-разрядные версии).
- ^ «Hadoop бьет мировые рекорды по сортировке данных» . CNET.com . 15 мая 2009 года . Проверено 8 сентября 2010 г.
- ^ Крис Найберг; Мехул Шах. «Домашняя страница сортировки эталона» . Проверено 30 ноября 2010 г.
- ^ Чайковский, Гжегож (21 ноября 2008 г.). «Сортировка 1 ПБ с помощью MapReduce» . Проверено 1 декабря 2010 г.
- ^ «ТШО10» . Архивировано из оригинала 18 октября 2010 года . Проверено 21 июня 2010 г.
- ^ «Как писать решения на Java @ Timus Online Judge» .
- ^ "ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ" .
- ^ «Часто задаваемые вопросы | Онлайн-судья TJU ACM-ICPC» . Архивировано из оригинала 29 июня 2010 года . Проверено 25 мая 2010 г.
- ^ «Часто задаваемые вопросы | CodeChef» .
- ^ «Домашняя страница онлайн-судьи Сидианского университета» . Архивировано из оригинала 19 февраля 2012 года . Проверено 13 ноября 2011 г.
- ^ "ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ" .
Ссылки
[ редактировать ]- Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991 .