автордың кітабынан сөз тіркестері Эффективный Java. Тюнинг кода на Java 8, 11 и дальше. 2-е межд. издание
Это вовсе не означает, что вы не должны добавлять в свой продукт новые возможности или новый код; разумеется, совершенствование программ приносит пользу. Но вы должны знать о тех компромиссах, на которые вам придется пойти, и упрощать свой код там, где это возможно.
1 Ұнайды
Во-первых, поскольку код Java интерпретируется при нескольких начальных выполнениях, чем дольше он выполняется, тем быстрее он начинает работать. По этой причине все хронометражные тесты (не только микробенчмарки) обычно включают период разогрева (warm-up), во время которого JVM может откомпилировать свой код в оптимальное состояние.
После того как многие потенциальные причины были отклонены, проблема оставалась, причем у нас не было базы данных, которую можно было обвинить в происходящем. Сл
Вырванные из контекста догмы классиков не должны мешать вам размышлять о коде, который вы пишете.
Это вовсе не означает, что вы не должны добавлять в свой продукт новые возможности или новый код; разумеется, совершенствование программ приносит пользу. Но вы должны знать о тех компромиссах, на которые вам придется пойти, и упрощать свой код там, где это возможно.
я вовсе не хочу сказать, что мы не должны работать над повышением производительности существующих приложений. Но как ни парадоксально, с добавлением новых возможностей и поддержкой новых стандартов (а это необходимо для того, чтобы не отстать от конкурирующих продуктов) программы обычно увеличиваются в размерах и начинают медленнее работать.
Все это понятно, но проблема в том, что маленькая хорошо написанная программа выполняется быстрее большой хорошо написанной программы. Это относится ко всем компьютерным программам вообще и к Java-программам в частности.
В конечном счете быстродействие приложения зависит от того, насколько качественно оно написано. Если программа перебирает все элементы массива, то JVM оптимизирует проверку границ массива, чтобы цикл выполнялся быстрее, а JVM может выполнить раскрутку цикла для дополнительного ускорения. Но если цикл предназначен для поиска конкретного элемента, никакая оптимизация в мире не заставит код массива работать так же быстро, как другая версия с хешированием.
Хороший алгоритм — самый важный фактор высокой производительности.
Флаги оптимизации JVM
JVM (с немногочисленными исключениями) получает флаги двух типов: логические флаги и флаги с параметром.
Логические флаги используют следующий синтаксис: -XX:+ИмяФлага устанавливает флаг, а -XX:-ИмяФлага сбрасывает его.
Флаги с параметром используют синтаксис -XX:ИмяФлага=значение; в этом случае ИмяФлага присваивается указанное значение. В тексте книги конкретное значение флага обычно заменяется чем-то, указывающим на произвольное значение. Например, -XX:NewRatio=N означает, что флагу NewRatio будет присвоено произвольное значение N (а последствия выбора N станут темой обсуждения).
Значения по умолчанию для всех флагов рассматриваются при первом упоминании флага. Значение по умолчанию часто определяется несколькими факторами: платформой, на которой работает JVM, а также аргументами командной строки JVM. Если у вас возникнут сомнения, в разделе «Основная информация VM» на с. 87 показано, как использовать флаг -XX:+PrintFlagsFinal (по умолчанию false) для определения значения по умолчанию конкретного флага в конкретной среде для заданной командной строки. Процесс автоматической оптимизации флагов в зависимости от параметров среды называется эргономикой.
Реализация JVM, загруженная с сайтов Oracle и AdoptOpenJDK, называется рабочей сборкой JVM. При сборке JVM из исходного кода можно построить много разных вариантов сборки: отладочные сборки, сборки для разработчиков и т.д. Такие сборки часто содержат дополнительную функциональность. В частности, сборки для разработчиков включают расширенный набор флагов оптимизации, чтобы разработчики могли поэкспериментировать с самыми незначительными аспектами различных алгоритмов, используемых JVM. Такие флаги обычно в книге не рассматриваются.
