автордың кітабынан сөз тіркестері Эффективный Java. Тюнинг кода на Java 8, 11 и дальше. 2-е межд. издание
Это вовсе не означает, что вы не должны добавлять в свой продукт новые возможности или новый код; разумеется, совершенствование программ приносит пользу. Но вы должны знать о тех компромиссах, на которые вам придется пойти, и упрощать свой код там, где это возможно.
1 Ұнайды
После того как многие потенциальные причины были отклонены, проблема оставалась, причем у нас не было базы данных, которую можно было обвинить в происходящем. Сл
Вырванные из контекста догмы классиков не должны мешать вам размышлять о коде, который вы пишете.
Это вовсе не означает, что вы не должны добавлять в свой продукт новые возможности или новый код; разумеется, совершенствование программ приносит пользу. Но вы должны знать о тех компромиссах, на которые вам придется пойти, и упрощать свой код там, где это возможно.
я вовсе не хочу сказать, что мы не должны работать над повышением производительности существующих приложений. Но как ни парадоксально, с добавлением новых возможностей и поддержкой новых стандартов (а это необходимо для того, чтобы не отстать от конкурирующих продуктов) программы обычно увеличиваются в размерах и начинают медленнее работать.
Все это понятно, но проблема в том, что маленькая хорошо написанная программа выполняется быстрее большой хорошо написанной программы. Это относится ко всем компьютерным программам вообще и к 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. Такие флаги обычно в книге не рассматриваются.
Буква «m» в jmh когда-то обозначала микробенчмарк (Microbenchmark), хотя теперь jmh рекламируется как фреймворк, подходящий для создания нано-/микро-/милли-/макробенчмарков.
