Адаптивная оптимизация: динамическая перекомпиляция на основе профиля выполнения.
Adaptive optimization
Адаптивная оптимизация: динамическая перекомпиляция кода для повышения производительности. Оптимизация под текущий профиль выполнения, снижение затрат на вызовы.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Адаптивная оптимизация — это техника в информатике, которая выполняет динамическую перекомпиляцию фрагментов программы на основе текущего профиля выполнения. При простой реализации адаптивный оптимизатор может выбирать между JIT-компиляцией и интерпретацией инструкций. На более продвинутом уровне адаптивная оптимизация может использовать локальные условия данных для оптимизации ветвлений и применять встроенную подстановку (inline expansion) для снижения стоимости вызовов процедур. Рассмотрим гипотетическое банковское приложение, обрабатывающее транзакции последовательно. Эти транзакции могут быть чеками, депозитами и множеством других, менее распространенных операций. В процессе выполнения программы реальные данные могут состоять из обработки десятков тысяч чеков без единого депозита и без единого чека с мошенническим номером счета. Адаптивный оптимизатор скомпилирует машинный код для оптимизации этого типичного случая. Если система затем начнет обрабатывать десятки тысяч депозитов, адаптивный оптимизатор перекомпилирует машинный код для оптимизации нового типичного случая. Эта оптимизация может включать встроенную подстановку кода. Примерами адаптивной оптимизации являются HotSpot и система Dynamo от HP. В некоторых системах, в частности в виртуальной машине Java, выполнение последовательности инструкций байт-кода может быть надежно отменено. Это позволяет адаптивному оптимизатору делать смелые предположения о коде. В приведенном выше примере оптимизатор может предположить, что все транзакции — это чеки и все номера счетов действительны. Если эти предположения окажутся неверными, адаптивный оптимизатор сможет вернуться в корректное состояние и затем правильно интерпретировать инструкции байт-кода.
Adaptive optimization is a technique in computer science that performs dynamic recompilation of portions of a program based on the current execution profile. With a simple implementation, an adaptive optimizer may simply make a trade off between just in time compilation and interpreting instructions. At another level, adaptive optimization may take advantage of local data conditions to optimize away branches and to use inline expansion to decrease the cost of procedure calls. Consider a hypothetical banking application that handles transactions one after another. These transactions may be checks, deposits, and a large number of more obscure transactions. When the program executes, the actual data may consist of clearing tens of thousands of checks without processing a single deposit and without processing a single check with a fraudulent account number. An adaptive optimizer would compile assembly code to optimize for this common case. If the system then started processing tens of thousands of deposits instead, the adaptive optimizer would recompile the assembly code to optimize the new common case. This optimization may include inlining code. Examples of adaptive optimization include HotSpot and HP's Dynamo system. In some systems, notably the Java Virtual Machine, execution over a range of bytecode instructions can be provably reversed. This allows an adaptive optimizer to make risky assumptions about the code. In the above example, the optimizer may assume all transactions are checks and all account numbers are valid. When these assumptions prove incorrect, the adaptive optimizer can 'unwind' to a valid state and then interpret the byte code instructions correctly.