Construire un Emacs 25 minimal pour les tests unitaires

10

Je voudrais construire une variante très minimale du tronc Emacs pour tester à l'unité mon package Emacs Lisp. La construction n'a besoin d'aucune interface graphique, d'aucune prise en charge d'image, etc. Elle devrait essentiellement être simplement un interpréteur Emacs Lisp minimal avec les bibliothèques Emacs Lisp de base, et elle devrait être rapide , idéalement en moins de cinq minutes.

Actuellement, je passe --with-x-toolkit=no --without-x --without-allà ./configure. Une fois terminé, il me dit que toutes les fonctionnalités d'Emacs sont désactivées, mais malheureusement, la construction prend encore près de dix minutes .

Je comprends qu'il pourrait être impossible d'obtenir la construction d'Emacs plus rapidement, mais ce qui me fait me demander, c'est qu'avec les mêmes drapeaux, Emacs 24.5 se construit en seulement deux minutes environ .

Quelle est la raison de cette différence flagrante, et puis-je obtenir le tronc Emacs pour construire aussi vite que Emacs 24.5?

Et, dans une question connexe, comment puis-je obtenir Emacs pour construire tranquillement? Actuellement, près de 80% de ma sortie de test unitaire est le bâtiment Emacs. Idéalement, je souhaiterais make installne pas imprimer du tout de sortie.

lunaryorn
la source
Envisagez-vous de le faire sur une sorte de plate-forme CI? Sinon, quel type d'ordinateur utilisez-vous? Évidemment, la vitesse de construction va être très dépendante de votre processeur, mais pour moi, cela se ./configure --with... && make -j (number of cores * 1.5)termine en 30 secondes. Si vous exécutez sur une machine locale, assurez-vous d'utiliser l'argument -j pour faire. Y a-t-il une bonne raison pour vous make install? Cela ajoutera un peu de temps que vous pourriez éviter si vous exécutez simplement emacs à partir du répertoire src.
Jordon Biondo
C'est Travis CI, mais je ne vois pas pourquoi cela compte? C'est la différence brute entre deux versions différentes d'Emacs dans la même machine que j'aurais aimé expliquer. IOW pourquoi le tronc est-il cinq fois plus long pour s'appuyer sur le même système ?
lunaryorn
La construction à partir d'un référentiel doit créer certains fichiers, qui sont déjà présents dans les tarballs distribués.
politza
@politza Quels fichiers? Je sais que je dois exécuter ./autogen.shpour générer configure, mais c'est une question de secondes, pas de minutes.
lunaryorn
2
@lunaryom Vous avez ici trois questions distinctes . 1: comment construire emacs rapidement, 2: pourquoi emacs 25 construit-il plus lentement qu'emacs 24.5 et 3: comment faire make installfonctionner silencieusement. Veuillez donc les diviser en 3 questions afin qu'elles puissent être suivies séparément et les modifier en conséquence pour rester avec une seule question.
rocheux

Réponses:

8

La raison pour laquelle 24.5 se construit si rapidement pour vous est que les .elcfichiers sont réellement distribués dans l'archive tar, voir make-dist . Lors de la construction à partir de git, la majorité du temps est consacrée à la compilation des .elfichiers .elc. En optimisant le code C, la compilation Lisp peut aller plus vite, mais cela prend encore beaucoup de temps. Comparez les temps de construction en utilisant vos paramètres d'origine (~ 14 vs ~ 1 minutes) avec une construction en utilisantCFLAGS='-O2 -march=native' (~ 9 vs ~ 1,5 minutes).

De plus, le clonage depuis git prend environ une minute, tandis que le téléchargement et le déballage de l'archive tar prennent environ 5 secondes. Comparez les temps de construction entre les versions lors du téléchargement de l'archive git à partir de github (~ 5, ~ 6, ~ 8 minutes respectivement pour v24.5, master et emacs-25. Comme vous pouvez le voir, lorsque vous n'utilisez pas l'archive de distribution, tous les les temps de construction sont au moins du même ordre de grandeur (vous ne savez pas pourquoi emacs-25 était plus lent que master, pourrait être une variation aléatoire, ou du code obsolète a été supprimé dans master?).

Et, dans une question connexe, comment puis-je obtenir Emacs pour construire tranquillement? Actuellement, près de 80% de ma sortie de test unitaire est le bâtiment Emacs. Idéalement, je souhaiterais make installne pas imprimer du tout de sortie.

Vous pouvez toujours rediriger la sortie vers /dev/null. Pour mes expériences, j'ai canalisé la make installsortie pour grep -E '^(make|[A-Z])'réduire la sortie (le javascript Travis CI qui formate le journal sur le Web avait des problèmes avec la sortie complète).

puis-je obtenir le tronc Emacs pour construire aussi vite que Emacs 24.5?

Non (ou oui dans le sens où vous pouvez obtenir Emacs 24.5 pour construire (presque) aussi lentement que le tronc Emacs: p). Mais ce que vous pouvez faire, c'est d'enregistrer la version Emacs, et il suffit de télécharger ce résultat mis en cache pour les tests unitaires. J'ai implémenté cela dans la branche de téléchargement de ma fourche emacs-travis, voici un exemple d'utilisation par yasnippet : Le temps d'installation d'Emacs est de ~ 2,5 secondes.

npostavs
la source
3

Voici différentes suggestions.

  1. Aucun fichier elc.

Comme indiqué ci-dessous, la compilation de tous les fichiers lisp représente au moins 10% du temps. Une façon de désactiver cela est de modifier la cible loaddefs dans le fichier lisp/Makefileet de la changer en:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Aucune optimisation du compilateur ou tables de symboles de débogueur

Actuellement, je passe --with-x-toolkit = no --without-x --without-all à ./configure.

J'ai pu réduire le temps de compilation C à 1/4 du temps (d'un peu moins d'une minute à 16 secondes) dans le src en changeant simplement les drapeaux de compilation par défaut. La valeur par défaut CFLAGS Je me suis eu: -g -O3.

Utilisez donc à la place CFLAGS=''.

  1. Ne lancez pas make install, mais exécutez simplement les emacs construits depuis l'intérieur du répertoire src .

Comme indiqué ci-dessous, 10% du temps est consacré à la création de documents. Bien que je ne l'ai pas chronométré, il y a sans aucun doute beaucoup de temps à copier et à compresser des fichiers elisp make install. Alors ne le fais pas. Si vous souhaitez refaire les chronogrammes, exécutez remake --profile.

Les observations ci-dessus sont basées sur ci-dessous ....


La première étape consiste à comprendre où le temps est passé pour trouver comment le réduire. Heureusement pour quelque chose comme Emacs, j'ai récemment écrit (ou plutôt étendu) un outil pour vous aider à le découvrir. J'ai ajouté une --profileoption pour refaire (un fork de GNU make) qui vous dira combien de temps est consacré à des cibles spécifiques.

J'ai essayé de créer un instantané récent et oui, cela prend environ 10 minutes. Si vous n'avez pas installé de remake, j'ai un résumé des informations de profilage que vous pouvez utiliser pour ma course. J'utilise kcachegrind pour afficher les informations mais il peut y avoir d'autres outils pour les outils de visualisation. Il y a un png dans l'essentiel qui est une capture d'écran de la course.

Passons maintenant aux détails ...

Dans ma course, environ 20% du temps est consacré à la création de fichiers lisp et info que vous n'avez pas vraiment besoin de faire. En fait, un peu plus est dépensé dans les fichiers lisp que dans les fichiers info. Vous pouvez probablement modifier le Makefile pour ignorer cela.

Il pourrait être intéressant de comparer avec emacs 24. Je suppose que la taille des deux a augmenté proportionnellement.

S'il y a un intérêt (que vous pouvez montrer par des votes positifs), je proposerai des hacks spécifiques au Makefile. Cependant, cela en soi devrait être suffisant pour une personne motivée à travailler.

rocheux
la source
"20% du temps est consacré à la création de lisp" - J'ai cloné le repo emacs- travis de @ lunaryorn, il semble que cela make lispprend environ 60% pour Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Et un gros morceau de make srccompile également du lisp, donc je me demande comment concilier ces mesures. Dans Emacs 24, il semble qu'il ne compile que des cc-*.elfichiers pendant make lisp, est-ce un bug?
npostavs
En outre, cela peut être sur l'illusion d'optique, mais il me semble que votre image de profilage ne représente que 50% au total.
npostavs
@npostavs remake ne fait que profiler l'heure de la cible, il ne s'inclut pas. Il est possible et probable qu'avec tous les fichiers et répertoires sous lisp, un temps considérable soit consacré à "remake" / "make" pour calculer ce qu'il faut refaire. En outre, même si «remake» est une fourchette de make, ce qu'ils font est similaire, pour des comparaisons plus étroites, vous devez comparer les temps de sortie de profilage de remake avec «remake» sans profilage, pas «make». Et aussi avec le même remake / Version faire Enfin, bien que l' on peut ergoter avec le% 's et ainsi de suite, les suggestions générales semblent appliquer à l' aide de vos données..
rocheux
De plus, ma mesure utilisait CFLAGS=''ce qui rend la compilation C plus rapide et la compilation lisp plus lente. Il s'avère que l'utilisation CFLAGS='-O2 -march=native'est globalement plus rapide pour Emacs 25, mais plus lente pour Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs
@npostavs Vous observez: la définition de CFLAGS "accélère la compilation C et ralentit la compilation lisp". Mais si vous allez exécuter un seul test, je ne sais pas si le temps global: une sorte de compilation / construction C optimisée + compilation LISP + exécution de test LISP sera inférieur à la compilation / construction C non optimisée + pas LISP compilation + test LISP.
rocheux