⚡️ Просто о сложном: как JIT делает код быстрее
Вы когда-нибудь задумывались, как JIT умеет так ловко оптимизировать код в реальном времени?
Сегодня разберём, какие именно суперспособности JIT даёт вашему коду.
🔹 Инлайнинг методов
Когда JIT обнаруживает, что какой-то метод выполняется слишком часто, он может инлайнить его. Это значит, что весь код метода не будет вызываться отдельно, а его инструкции будут вставляться прямо в место вызова.
Пример:
Стало:
🔹 Удаление мертвого кода
JIT всегда анализирует, выполняется ли тот или иной участок кода. Если метод или условие никогда не будет вызвано (например, условие, которое всегда ложно), JIT его удаляет.
🔹 Оптимизация циклов
Циклы — частая конструкция, и JIT всегда старается оптимизировать их выполнение. Например, если цикл выполняется много раз, JIT может переработать его для уменьшения количества операций.
🔹 Параллельная компиляция
Если ранее компиляция шла поэтапно, сейчас JIT может компилировать несколько частей программы одновременно. Это не только ускоряет работу компилятора, но и уменьшает задержки при запуске программы.
🔹 Использование final переменных
JIT предполагает, что final переменные не изменяются после инициализации. Это даёт компилятору возможность предсказать их значения и оптимизировать операции с ними.
🔹 Удаление лишних проверок
JIT понимает, какие проверки в коде избыточны. Например, если переменная была уже проверена на null, и это значение не изменяется, JIT может просто игнорировать повторные проверки.
🔹 Классификация горячих и холодных методов
JIT следит за тем, какие методы выполняются часто (горячие) и какие — нет (холодные). Он решает компилировать только те методы, которые чаще всего используются. Если горячий метод вдруг перестаёт быть горячим, JIT может освободить его от компиляции, освобождая ресурсы.
🔹 Слияние и удаление дубликатов
Если программа выполняет одинаковые операции несколько раз, JIT сливает их в одну или избавляется от дублирующихся вычислений.
Пример:
JIT может понять, что a + b одинаково для обеих операций, и просто использовать результат из первого вычисления во втором.
💬 Пишите в комменты, какие инструменты ещё разобрать.
🐸 Библиотека джависта
#CoreJava
Вы когда-нибудь задумывались, как JIT умеет так ловко оптимизировать код в реальном времени?
Сегодня разберём, какие именно суперспособности JIT даёт вашему коду.
🔹 Инлайнинг методов
Когда JIT обнаруживает, что какой-то метод выполняется слишком часто, он может инлайнить его. Это значит, что весь код метода не будет вызываться отдельно, а его инструкции будут вставляться прямо в место вызова.
Пример:
int sum(int a, int b) {
return a + b;
}
int result = sum(5, 10);Стало:
int result = 5 + 10; // JIT инлайнит код метода sum
🔹 Удаление мертвого кода
JIT всегда анализирует, выполняется ли тот или иной участок кода. Если метод или условие никогда не будет вызвано (например, условие, которое всегда ложно), JIT его удаляет.
🔹 Оптимизация циклов
Циклы — частая конструкция, и JIT всегда старается оптимизировать их выполнение. Например, если цикл выполняется много раз, JIT может переработать его для уменьшения количества операций.
🔹 Параллельная компиляция
Если ранее компиляция шла поэтапно, сейчас JIT может компилировать несколько частей программы одновременно. Это не только ускоряет работу компилятора, но и уменьшает задержки при запуске программы.
🔹 Использование final переменных
JIT предполагает, что final переменные не изменяются после инициализации. Это даёт компилятору возможность предсказать их значения и оптимизировать операции с ними.
🔹 Удаление лишних проверок
JIT понимает, какие проверки в коде избыточны. Например, если переменная была уже проверена на null, и это значение не изменяется, JIT может просто игнорировать повторные проверки.
🔹 Классификация горячих и холодных методов
JIT следит за тем, какие методы выполняются часто (горячие) и какие — нет (холодные). Он решает компилировать только те методы, которые чаще всего используются. Если горячий метод вдруг перестаёт быть горячим, JIT может освободить его от компиляции, освобождая ресурсы.
🔹 Слияние и удаление дубликатов
Если программа выполняет одинаковые операции несколько раз, JIT сливает их в одну или избавляется от дублирующихся вычислений.
Пример:
int a = 5;
int b = 5;
int c = a + b;
int d = a + b; // Дублирование
JIT может понять, что a + b одинаково для обеих операций, и просто использовать результат из первого вычисления во втором.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🔥2
Многие недооценивают, насколько ArrayList может быть узким местом в производительности, особенно при работе с большими объёмами данных. Разберём, как оптимизировать его использование 👇
⚙️ Указывайте ёмкость при создании
По умолчанию:
List<String> list = new ArrayList<>();
ArrayList начинает с небольшой ёмкости (10 элементов) и каждый раз увеличивается в 1.5 раза, когда не хватает места. Это вызывает множество копирований массива, что замедляет работу при миллионах элементов.
List<String> list = new ArrayList<>(1_000_000);
Если вы знаете (или можете оценить) количество элементов заранее — выделите память сразу. Это уменьшает количество realocations и экономит до 30–40% времени при массовых вставках.
🧠 Очищайте, а не пересоздавайте
Многие делают так:
list = new ArrayList<>();
Это создаёт новый объект и выбрасывает старый в GC. При частых операциях — GC начинает тормозить систему.
list.clear();
Если список используется повторно, очистка быстрее и не требует новой аллокации памяти.
⚡️ Не используйте remove() в цикле
Удаление элементов в цикле вручную — частая и дорогая ошибка.
Плохо:
for (String s : list) {
if (s.startsWith("A")) list.remove(s);
}❌ Такой код приведёт к ConcurrentModificationException.
Даже если использовать Iterator, это безопасно, но медленно — каждый вызов remove() сдвигает все последующие элементы (O(n) на удаление).
list.removeIf(s -> s.startsWith("A"));Метод removeIf оптимизирован под внутренние операции и работает быстрее при массовом удалении.
* Кстати, у нас есть курс по Алгоритмам и структурам данных со скидкой.
Ставь → 🔥, если интересно почитать про внутреннюю реализацию стандартных методов коллекций.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52👍11❤4