Сборка минимального Emacs 25 для модульного тестирования

10

Я хотел бы построить очень минимальный вариант транка 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печать вообще не выводилась.

lunaryorn
источник
Планируете ли вы сделать это на какой-то платформе CI? Если нет, то какой компьютер вы используете? Очевидно, что скорость сборки будет сильно зависеть от вашего процессора, но для меня она ./configure --with... && make -j (number of cores * 1.5)заканчивается через 30 секунд. Если вы работаете на локальной машине, обязательно используйте аргумент -j. Есть ли для вас веская причина make install? Это добавит немного времени, которого вы можете избежать, если просто запустите emacs из каталога src.
Джордон Биондо
Это Трэвис, но я не понимаю, почему это важно? Это большая разница между двумя разными версиями Emacs на одной машине, которую я бы хотел объяснить. IOW, почему транк, который в пять раз дольше, собирается на одной системе ?
lunaryorn
Сборка из репозитория должна создавать определенные файлы, которые уже присутствуют в распределенных архивах.
политза
@politza Какие файлы? Я знаю, что мне нужно запустить, ./autogen.shчтобы сгенерировать configure, но это считанные секунды, а не минуты.
lunaryorn
2
@lunaryom У вас есть три отдельных вопроса здесь. 1: как быстро собрать emacs, 2: почему emacs 25 собирается медленнее, чем emacs 24.5 и 3: как заставить make installработать без вывода сообщений. Поэтому, пожалуйста, разбейте их на 3 вопроса, чтобы их можно было отслеживать отдельно, и отредактируйте их соответствующим образом, чтобы они соответствовали одному вопросу.
каменистый

Ответы:

8

Причина, по которой 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?).

И, в связанном вопросе, как заставить Emacs спокойно строить? В настоящее время почти 80% моих результатов модульных тестов - сборка Emacs. В идеале, я бы хотел, чтобы make installпечать вообще не выводилась.

Вы всегда можете перенаправить вывод на /dev/null. Для моих экспериментов я передал make installвывод, чтобы grep -E '^(make|[A-Z])'сократить вывод (javascript Travis CI, который форматирует журнал в Интернете, имел проблемы с полным выводом).

я могу заставить ствол Emacs строить так же быстро, как Emacs 24.5?

Нет (или да, в том смысле, что вы можете заставить Emacs 24.5 строить (почти) так же медленно, как ствол Emacs: p). Но вы можете сохранить сборку Emacs и просто загрузить этот кэшированный результат для модульного тестирования. Я реализовал это в ветке загрузки моего форка emacs-travis, вот пример использования yasnippet : время установки Emacs составляет ~ 2.5 секунды.

npostavs
источник
3

Вот различные предложения.

  1. Нет файлов elc.

Как указано ниже, компиляция всех файлов lisp занимает не менее 10% времени. Один из способов отключить это - отредактировать цель loaddefs в файле lisp/Makefileи изменить ее на:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Нет оптимизации компилятора или таблиц символов отладчика

В настоящее время я передаю --with-x-toolkit = no --without-x --without-all в ./configure.

Мне удалось сократить время компиляции C до 1/4 времени (с чуть менее минуты до 16 секунд) в src, просто изменив флаги компиляции по умолчанию. По умолчанию CFLAGS я получил было: -g -O3.

Так что используйте вместо этого CFLAGS=''.

  1. Не запускайте 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. Однако этого должно быть достаточно для того, чтобы кто-то мотивировал работать.

скалистый
источник
«20% времени тратится на создание lisp» - я клонировал репозиторий emacs-travis @ lunaryorn, похоже, что make lispдля Emacs 25 требуется около 60%: travis-ci.org/npostavs/emacs-travis/builds/91107858 . И большой кусок make srcтакже компилирует lisp, поэтому мне интересно, как согласовать эти измерения. В Emacs 24 похоже, что он только компилирует cc-*.elфайлы make lisp, это ошибка?
npostavs
Кроме того, это может быть из-за оптической иллюзии, но мне кажется, что ваша картинка профилирования составляет всего около 50%.
npostavs
Римейк @npostavs только профилирует время цели, но не включает себя. Возможно и вероятно, что со всеми файлами и каталогами в lisp, существует значительное время, затрачиваемое на "римейк" / "make" при вычислении того, что переделывать. Кроме того, несмотря на то, что «римейк» является форком make, то, что они делают, похоже, для более близких сравнений вы должны сравнить время вывода профилирования ремейка с «римейком» без профилирования, а не «make». А также с тем же римейком make version. Наконец, хотя можно спорить с% s и т. д., общие предложения, похоже, применимы с использованием ваших данных.
Rocky
Кроме того, использовались мои измерения, CFLAGS=''которые ускоряют компиляцию C и замедляют компиляцию LISP. Как оказалось, использование CFLAGS='-O2 -march=native'Emacs 25 в целом быстрее, но медленнее для Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs
@npostavs Вы наблюдаете: установка CFLAGS «ускоряет компиляцию C и замедляет компиляцию LISP». Но если вы собираетесь запустить один тест, я не уверен, будет ли общее время: какой-то оптимизированный компиляция / сборка C + компиляция LISP + тестовый прогон LISP будет меньше, чем неоптимизированный компиляция / сборка C + нет LISP тест + компиляция LISP.
скалистое