D.4 Советы по ускорению скомпилированного кода
Вот способы повышения скорости выполнения байт-скомпилированных
программ Lisp.
- Профилируйте свою программу, чтобы узнать, на что уходит время.
См. Профилирование.
- По возможности используйте итерацию вместо рекурсии.
Вызовы функций медленные в Emacs Lisp, даже когда скомпилированная функция
вызывает другую скомпилированную функцию.
- Использование примитивных функций поиска списков
memq, member,
assq или assoc даже быстрее явной итерации.
Возможно, стоит изменить структуру данных, чтобы можно было использовать одну из этих
примитивных функций поиска.
- Некоторые встроенные функции обрабатываются по-особому в байт-скомпилированном коде,
что избавляет от необходимости обычного вызова функции. Хорошей идеей является
использование этих функций вместо альтернатив. Чтобы узнать, обрабатывается ли
функция компилятором по-особому, изучите ее свойство
byte-compile.
Если свойство не равно nil, то функция обрабатывается по-особому.
Например, следующий ввод покажет, что aref
компилируется по-особому (см. Функции, работающие с массивами):
(get 'aref 'byte-compile)
⇒ byte-compile-two-args
Обратите внимание, что в этом случае (и во многих других) вы должны сначала загрузить
библиотеку bytecomp, которая определяет свойство byte-compile.
- Если вызов небольшой функции составляет значительную часть времени
выполнения вашей программы, сделайте функцию инлайновой. Это устраняет
накладные расходы на вызов функции. Поскольку превращение функции в инлайн
снижает гибкость изменения программы, не делайте этого, если это не дает
заметного ускорения в чем-то достаточно медленном, чтобы пользователи
заметили скорость. См. Инлайновые функции.