Я хотел бы построить очень минимальный вариант транка Emacs для модульного тестирования моего пакета Emacs Lisp. Сборка не требует графического интерфейса, поддержки изображений и т. Д. По сути, она должна быть просто минимальным интерпретатором Emacs Lisp с базовыми библиотеками Emacs Lisp, и она должна быть быстрой , в идеале менее чем за пять минут.
В настоящее время я перехожу --with-x-toolkit=no --without-x --without-all
к ./configure
. После его завершения он сообщает, что все функции Emacs отключены, но, к сожалению, сборка все еще занимает почти десять минут .
Я понимаю, что может быть невозможно заставить Emacs работать быстрее, но меня удивляет то, что с теми же флагами Emacs 24.5 собирается всего за две минуты .
В чем причина такой большой разницы, и можно ли заставить Emacs транк строить так же быстро, как Emacs 24.5?
И, в связанном вопросе, как заставить Emacs спокойно строить? В настоящее время почти 80% моих результатов модульных тестов - сборка Emacs. В идеале, я бы хотел, чтобы make install
печать вообще не выводилась.
источник
./configure --with... && make -j (number of cores * 1.5)
заканчивается через 30 секунд. Если вы работаете на локальной машине, обязательно используйте аргумент -j. Есть ли для вас веская причинаmake install
? Это добавит немного времени, которого вы можете избежать, если просто запустите emacs из каталога src../autogen.sh
чтобы сгенерироватьconfigure
, но это считанные секунды, а не минуты.make install
работать без вывода сообщений. Поэтому, пожалуйста, разбейте их на 3 вопроса, чтобы их можно было отслеживать отдельно, и отредактируйте их соответствующим образом, чтобы они соответствовали одному вопросу.Ответы:
Причина, по которой 24.5 создается для вас так быстро, заключается в том, что
.elc
файлы на самом деле распространяются в архиве, см. Make-dist . При сборке из git большая часть времени тратится на компиляцию.el
файлов.elc
. Оптимизируя код на C, компиляция Lisp может идти быстрее, но это все еще занимает много времени. Сравните время сборки с использованием исходных настроек (~ 14 против ~ 1 минуты) с использованием сборкиCFLAGS='-O2 -march=native'
(~ 9 против ~ 1,5 минуты).Кроме того, клонирование из git занимает около минуты, а загрузка и распаковка тарболла - около 5 секунд. Сравните время сборки между версиями при загрузке git-архива с github (~ 5, ~ 6, ~ 8 минут для v24.5, master и emacs-25, соответственно. Как вы можете видеть, если не использовать tar-архив дистрибутива, все время сборки, по крайней мере, одного порядка (не уверен, почему emacs-25 был медленнее, чем master, может быть случайным отклонением или какой-то устаревший код был удален в master?).
Вы всегда можете перенаправить вывод на
/dev/null
. Для моих экспериментов я передалmake install
вывод, чтобыgrep -E '^(make|[A-Z])'
сократить вывод (javascript Travis CI, который форматирует журнал в Интернете, имел проблемы с полным выводом).Нет (или да, в том смысле, что вы можете заставить Emacs 24.5 строить (почти) так же медленно, как ствол Emacs: p). Но вы можете сохранить сборку Emacs и просто загрузить этот кэшированный результат для модульного тестирования. Я реализовал это в ветке загрузки моего форка emacs-travis, вот пример использования yasnippet : время установки Emacs составляет ~ 2.5 секунды.
источник
Вот различные предложения.
Как указано ниже, компиляция всех файлов lisp занимает не менее 10% времени. Один из способов отключить это - отредактировать цель loaddefs в файле
lisp/Makefile
и изменить ее на:Мне удалось сократить время компиляции C до 1/4 времени (с чуть менее минуты до 16 секунд) в src, просто изменив флаги компиляции по умолчанию. По умолчанию CFLAGS я получил было:
-g -O3
.Так что используйте вместо этого
CFLAGS=''
.make install
, а просто запускайте встроенный emacs из каталога src .Как указано ниже, еще 10% времени уходит на создание документации. Хотя я и не рассчитывал это время, нет сомнений, что много времени копируется и сжимается в файлы elisp
make install
. Так что не надо. Если вы хотите повторить временные диаграммы, запуститеremake --profile
.Приведенные выше наблюдения основаны на ниже ....
Первый шаг - понять, на что тратится время, чтобы понять, как его уменьшить. К счастью для чего-то вроде Emacs, я недавно написал (или, скорее, расширил) инструмент, который поможет вам узнать. Я добавил
--profile
опцию переделки (форк GNU make), которая скажет вам, сколько времени тратится на конкретные цели.Я попробовал это сделать недавний снимок, и да, это занимает около 10 минут. Если у вас не установлен римейк, у меня есть информация о профилировании, которую вы можете использовать в моем прогоне. Я использую kcachegrind для отображения информации, но могут быть и другие инструменты для инструментов визуализации. В сущности есть png, который является скриншотом бега.
Теперь к деталям ...
В моем случае около 20% времени тратится на создание lisp и информационных файлов, которые вам на самом деле не нужны. На самом деле в файлах lisp тратится немного больше, чем в файлах info. Вы можете изменить Makefile, чтобы пропустить это.
Это может быть интересно сравнить с emacs 24. Я предполагаю, что размеры обоих из них выросли пропорционально.
Если есть интерес (который вы можете продемонстрировать при помощи голосов), я предложу конкретные хаки в Makefile. Однако этого должно быть достаточно для того, чтобы кто-то мотивировал работать.
источник
make lisp
для Emacs 25 требуется около 60%: travis-ci.org/npostavs/emacs-travis/builds/91107858 . И большой кусокmake src
также компилирует lisp, поэтому мне интересно, как согласовать эти измерения. В Emacs 24 похоже, что он только компилируетcc-*.el
файлыmake lisp
, это ошибка?CFLAGS=''
которые ускоряют компиляцию C и замедляют компиляцию LISP. Как оказалось, использованиеCFLAGS='-O2 -march=native'
Emacs 25 в целом быстрее, но медленнее для Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923