Створіть мінімальний 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друк взагалі не мав виводу.


Ви плануєте робити це на якійсь платформі CI? Якщо ні, то який комп'ютер ви використовуєте? Очевидно, швидкість збирання буде дуже залежати від вашого процесора, але для мене ./configure --with... && make -j (number of cores * 1.5)закінчується за 30 секунд. Якщо ви працюєте на локальній машині, не забудьте використати аргумент -j. Чи є для вас вагомі причини make install? Це додасть трохи часу, якого ви могли б уникнути, якщо просто запустите emacs з каталогу src.
Джордон Біондо

Це Travis CI, але я не розумію, чому це має значення? Я б хотів пояснити , що це велика різниця між двома різними версіями Emacs в одній машині. IOW, чому магістраль, яка в п’ять разів довше будується на одній системі ?
місячник

Створення з репозиторію потрібно створити певні файли, які вже є у розподілених тарболах.
politza

@politza Які файли? Я знаю, що мені потрібно бігти, ./autogen.shщоб генерувати configure, але це питання секунд, а не хвилин.
місячник

2
@lunaryom У вас тут три окремих питання. 1: як швидко створювати emacs, 2: чому emacs 25 будує повільніше, ніж emacs 24.5 і 3: як змусити make installпрацювати безшумно. Тому, будь ласка, розділіть їх на 3 питання, щоб їх можна було відстежувати окремо і відредагуйте відповідно до цього.
rocky

Відповіді:


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. відповідно. Як ви бачите, коли не використовується розподільний тарбол, усі Часи збірки принаймні однакові порядок. (не впевнений, чому emacs-25 був повільнішим, ніж головний, може бути випадкова зміна, або який-небудь застарілий код був видалений у майстрі?).

І, пов'язане питання, як змусити 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 trunk: p). Але ви можете зробити це зберегти збірку Emacs і просто завантажити цей кешований результат для тестування одиниць. Я реалізував це у гілці завантаження моєї вилки emacs-travis, ось приклад використання yasnippet : Час установки Emacs становить ~ 2,5 секунди.


3

Ось різні пропозиції.

  1. Немає файлів elc.

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

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

Наразі я передаю --with-x-toolkit = ні --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 та info, які вам насправді не потрібно робити. Насправді трохи більше витрачається на файли lisp, ніж на файли інформації. Ви можете, можливо, змінити Makefile, щоб пропустити це.

Це може бути цікаво порівняти з emacs 24. Я думаю, що розміри обох зросли пропорційно.

Якщо є інтерес (який ви можете проявити за допомогою оголошень), я запропоную конкретні хаки для Makefile. Однак цього само по собі повинно бути достатньо для того, хто працює з мотивацією.


"20% часу витрачається на будівництво лісп" - я клонував @ lunaryorn's emacs-travis repo, схоже, make lispце займає близько 60% для Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . І великий шматок make srcтакож збирає lisp, тому мені цікаво, як узгодити ці вимірювання. У Emacs 24 схоже, що він збирає cc-*.elфайли лише під час make lisp, це помилка?
npostavs

Також це може бути оптичною ілюзією, але мені здається, що ваша картина профілювання складає лише приблизно 50%.
npostavs

@npostavs переробляє лише профіль часу мети, він не включає себе. Цілком імовірно, що для всіх файлів і каталогів, які знаходяться під lisp, існує значний час, витрачений на "переробку" / "make" на обчислення того, що потрібно переробити. Крім того, навіть якщо «рімейк» є форк виготовлення, тому те, що вони роблять, є подібним, для більш детального порівняння слід порівнювати час профілювання ремейку з «рімейком» без профілювання, а не з «виготовленням». А також з тим же римейком / Нарешті, хоча можна посперечатися з% і так далі, загальні пропозиції, мабуть, застосовуються за допомогою ваших даних.
rocky

Також було використано моє вимірювання, CFLAGS=''яке робить компіляцію C швидшою, а компіляцію - ліпшою. Як виявляється, використання CFLAGS='-O2 -march=native'в Emacs 25 швидше загальне, хоч і повільніше для Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs

@npostavs Ви зауважуєте: налаштування CFLAGS "робить компіляцію C швидшою, а компіляцію -" повільнішою ". Але якщо ви збираєтеся запустити один тест, я не впевнений, чи загальний час: певна оптимізована компіляція / збірка C-компіляція + LISP-компіляція + тест LISP-тесту буде меншою, ніж неоптимізована компіляція / складання + не LISP компілювати + тестовий запуск LISP.
скелястий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.