div.main {margin-left: 20pt; margin-right: 20pt} Можно ли использовать компиляторы для того, чтобы
оптимизировать Ваш Java код?
Содержание
Рэгги Хатчерсон (Reggie Hutcherson) объясняет в каких
случаях можно использовать компилятор для оптимизации кода, а когда - нет. Здесь
также обсуждается эффективность использования наиболее распространенных методик
оптимизации, применяемых компиляторами Java: введение констант и удаление
неиспользуемого кода.
Java разработчики имеющие опыт работы с компиляторами других языков
программирования, привыкли к выполнению компиляторами различных оптимизации. В
процессе отладки, как привило, все режимы оптимизации отключаются в целях
экономии времени, и отладчики работают с не оптимизированным кодом. Затем, по
завершении отладки, режимы оптимизации компилятора включаются для получения
максимально эффективного и быстродействующего кода. Это стало возможным
благодаря тому, что большинство существующих 3GL (языков программирования
третьего поколения) способны обеспечить безопасную оптимизацию, используя
существующие аппаратные и программные платформы.
Надежная работа современных компиляторов привела к тому, что
некоторые разработчики всецело полагаются на них и не особо утруждают себя,
компилируя "грязный" код. Следует помнить что возможности компилятора не
безграничны. Некоторые из них могут слегка подчистить неэффективный код, но ни
один не сможет что-либо сделать с плохо разработанным кодом. В качестве примера
рассмотрим код, выполняющий инициализацию массива: int a = 5;
int b = 7;
int *acc[10];for (i=0; I<10;i++)
*acc[i] = a + b;
Поскольку a и b инвариантны и не изменяют свои значения в цикле,
нет необходимости в их сложении на каждой итерации цикла. Практически любой из
нормальных компиляторов выполнит оптимизацию этого кода. Оптимизатор повысит
эффективность выполнения цикла путем выноса операции сложения a+b за пределы
цикла. Оптимизированный вариант кода будет выглядеть приблизительно следующим
образом: int a = 5;
int b = 7;
int c = a + b;int *acc[10];for (i=0; I<10;i++)
*acc[i] = c;
Это простейший пример оптимизации инвариантного кода. Разумеется
существуют гораздо более сложные оптимизации. Большинство компиляторов Java
выполняют на удивление незначительные оптимизации кода. Одними из наиболее
распространенных видов оптимизаций, поддерживаемых большинством компиляторов
Java являются введение констант и удаление неиспользуемого
кода.
Введение констант
Введение новых констант производится компилятором с целью
предварительного вычисления выражений. Например, рассмотрим следующий код: static final int length = 25;
static final int width = 10;
int res = length * width;
В данном случае умножение производится не в процессе выполнения
программы, а на стадии компиляции. Код для определения переменной res будет
модифицирован таким образом, чтобы сгенерировать байткод, адекватный
произведению переменных length и width, то есть:
int res = 250;
Удаление неиспользуемого кода
Простейшая операция по удалению неиспользуемого кода позволяет
компилятору предотвратить генерацию блоков байткода, которые в дальнейшем не
будут выполняться. Операция по удалению неиспользуемого кода в процессе
выполнения программы не производится, однако, на этапе компиляции это позволяет
сократить размер генерируемых файлов классов. Например, в приведенном далее
примере два выражения в методе nocode() не будут преобразованы в байткод: class Text
{
public static final boolean trace = false;
public void nocode()
{
if (Test.trace)
{
<....>
} if (false)
{
<....>
}
}
}
Если выражение примет значение false в процессе выполнения
программы, код будет сгенерирован. Байткод не будет сгенерирован лишь в том
случае, если выражение примет значение false при компиляции.
Итоги
Разработчики должны понимать что в статье рассмотрены лишь
несколько поддерживаемых большинством компиляторов Java методов оптимизации. Для
тех из вас, кто использует компиляторы с весьма скромным набором оптимизаций
существует три варианта решения этой проблемы:
Выполнять оптимизацию кода вручную, дабы добиться повышения эффективности
работы программ.
Положиться на оптимизацию, выполняемую во время выполнения программ,
осуществляемую JIT компиляторами или адаптивными технологиями компиляции (т.е.
HotSpot)
Использовать компиляторы третьих лиц, которые выполняют оптимизацию Java
кода при генерации байткода.
Поскольку компиляторы третьих лиц постоянно совершенствуются и конкурируют с
продуктами основных производителей компиляторов, ситуация на рынке технологий
Java компиляторов должна изменяться к лучшему.
•Информация о авторе
Рэгги Хатчерсон (Reggie Hutcherson) активно
проповедует использование технологий платформы Sun Java2 во всем мире. Особое
внимание он уделяет вопросам изучения работы с движками J2SE и
HotSpot.
|