Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #64, МАРТ 2006 г.

рецепты lua

АЛЕКСАНДР ГЛАДЫШ

Спецвыпуск: Хакер, номер #064, стр. 064-042-4


? SWIG (www.swig.org);

? Luabind (luabind.sourceforge.net).

И toLua, и SWIG генерируют код регистрации по специально подготовленным входным файлам (SWIG умеет генерировать такой код не только для Lua, но и для множества скриптовых языков).

Luabind использует шаблоны C++ для генерации кода регистрации твоих типов в Lua, поэтому он избавляет от промежуточного этапа генерации кода сторонними средствами за счет некоторого оверхеда в скорости компиляции и объемах конечного исполняемого файла. По моему опыту, удобнее всего пользоваться библиотекой Luabind в сочетании с прямым использованием Lua C API (чтобы реализовать отдельные тонкие моменты).

вопросы производительности

При разработке программ на Lua нужно иметь в виду, что компилятор этого языка не обладает широкими способностями по оптимизации. С другой стороны, интерпретатор Lua реализован очень эффективно и чаще всего обеспечивает весьма приличную скорость работы. Если же тебе нужна сверхвысокая производительность, ты должен сам следить за тем, чтобы в коде не было множества лишних конструкций. Добиться этого будет легче, если будешь придерживаться нескольких простых правил при написании кода на Lua (подробнее о подходах к оптимизации кода на Lua — в материалах, опубликованных в Lua Us-ers Wiki).

Доступ к локальным переменным в Lua несколько быстрее, чем к глобальным. Если требуется интенсивный доступ к глобальной таблице, функции или корутине, лучше завести локальную, присвоить ей значение глобальной и только потом начинать использовать. Эта техника не несет накладных расходов на копирование, так как в Lua данные таких типов копируются как ссылки, а не как значения.

По возможности в коде, критичном по производительности, не создавай множество объектов Lua, управляемых сборщиком мусора. Такие объекты создаются при склеивании строк, вызове конструкторов таблиц (например при вызовах функций с переменным числом аргументов), при объявлении любых функций, при выполнении команд dofile/dostring.

Компилятор Lua способен выполнять элементарную оптимизацию. Например, он оптимизирует простые выражения с участием переменных и констант. Не обязательно заменять, скажем, выражение

a = 2 * 34567 + b

на

a = 69134 + b.

Перевод скриптового кода в код на C++ — один из действенных методов оптимизации. Если тебе вдруг показалось, что какой-то участок кода на Lua нужно подвергнуть интенсивной оптимизации, может быть, ты обнаружил первый сигнал к тому, что этот кусок кода нужно переписать на C++.

Заботясь о производительности кода, остерегайся преждевременной оптимизации. По возможности соблюдай рекомендации по написанию оптимального по производительности кода — писать гарантированно медленный код не стоит. Однако, как известно, затраты, скажем, на оптимизацию куска кода, который выполняется не более 1% времени, не уменьшат временные затраты на выполнение программы больше чем на 1%.

Сначала реализуй код самым удобным (по твоим ощущениям) способом. Если понадобится, собирай статистику с помощью таких инструментов, как Lua Profiler (www.keplerproject.org/luaprofiler). И оптимизируй только то, что действительно должно быть оптимизировано.

Назад на стр. 064-042-3  Содержание  Вперед на стр. 064-042-5