Je vois des performances extrêmement variées en fonction du nombre de nouvelles lignes figurant dans le fichier que je visite.
Voici un exemple. J'ai deux fichiers JSON:
$ wget https://github.com/Wilfred/ReVo-utilities/blob/a4bdc40dd2656c496defc461fc19c403c8306d9f/revo-export/dictionary.json?raw=true -O one_line.json
$ python -m json.tool <one_line.json >pretty_printed.json
Ce sont deux fichiers JSON avec le même contenu. one_line.json
est 18MiB de JSON sans nouvelles lignes. pretty_printed.json
a des nouvelles lignes et des espaces ajoutés, ce qui en fait 41 Mo.
Cependant, le fichier plus volumineux divisé sur plusieurs lignes est beaucoup plus rapide à ouvrir dans Emacs, aussi bien en mode Javascript qu'en mode fondamental.
Pourquoi Emacs a-t-il des performances si médiocres avec les longues lignes, vu que c'est en fait moins d'octets? Puis-je faire quelque chose pour améliorer les performances sans reformater les données en dehors d'Emacs?
line-break
performance
Wilfred Hughes
la source
la source
View Large Files
(vlf) est un mode mineur destiné à aider à l'édition de gros fichiers en les chargeant par lots . Déni de responsabilité: je ne l'ai jamais utilisé et je ne sais pas s'il gère également les longues lignes par lots .$ tail -f /some/file | fold -s
dans un tampon. Ce n'est évidemment pas bon pour l'édition, mais aide beaucoup à la lecture.Réponses:
Le traitement des longues lignes par Emacs n’est pas très optimisé. Pour un certain nombre d'opérations, Emacs doit balayer la ligne entière de manière répétée. Par exemple, pour afficher une ligne, Emacs doit déterminer la hauteur de la ligne, ce qui nécessite de balayer toute la ligne pour trouver le glyphe le plus haut. De plus, la recherche d’affichage bidirectionnel prend beaucoup de temps. Vous pouvez obtenir des informations supplémentaires dans, par exemple, la docstring de
cache-long-line-scans
(renomméecache-long-scans
en 24.4).Vous pouvez essayer de voir si régler
bidi-paragraph-direction
pourleft-to-right
améliorer votre vitesse [réglerbidi-display-reordering
surnil
, fait plus ou moins la même chose mais est uniquement destiné à des fins internes / de débogage]. Cela supprime un contributeur important aux analyses de ligne, mais malheureusement pas le seul.La meilleure option consiste à ajouter des nouvelles lignes. Vous pouvez diriger un fichier JSON, par exemple,
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
pour ajouter des nouvelles lignes et améliorer la lisibilité en général.la source
(setq-default bidi-display-reordering nil)
- Certains utilisateurs peuvent ne pas se rendre compte qu'il s'agit d'une variable locale du tampon, ce qui peut nécessiter un paramètre par défaut si un utilisateur souhaite que cela soit global. J'aurais aimé ajouter cela à mesinit.el
années précédentes ... mais au moins, c'est là maintenant. Merci beaucoup!!!bidi-display-reordering
: «L’un de mes commentaires est que la désactivation de bidi-display-reordering… met le moteur d’affichage dans un état qui n’est pas testé et peut provoquer des incohérences. et même des bugs (parce que certaines parties du code ont été écrites en supposant que cette variable n'est jamais nulle). "J'ai fait quelques brèves expériences avec cela en utilisant une copie réduite de jQuery.
font-lock-mode
et lesflycheck-mode
deux ont contribué à la lenteur, comme l'a faitjs2-mode
, etprettify-symbols-mode
.line-number-mode
et acolumn-number-mode
eu un effet mineur. Une fois que j'avais désactivé tous les modes, la performance était relativement vive. Utilisez C-h met commencez à désactiver les différents modes activés ou essayez simplement de basculer versfundamental-mode
.De manière intéressante,
hexl-mode
je pouvais parcourir le fichier sans problème, bien que les colonnes soient évidemment assez courtes. Malheureusement, lesvisual-line-mode
choses ont vraiment ralenti.Mon hypothèse est que la table de syntaxe est heureuse d’arrêter le traitement en fin de ligne et que, sur une seule ligne, elle doit tout réparer à chaque mise à jour.
la source
J'ai téléchargé http://www.emacswiki.org/emacs/OverLongLineMode
Cette bibliothèque vous permet de définir des seuils simples de longueur de ligne au-delà desquels une variante de
fundamental-mode
sera utilisée pour un fichier au lieu de son mode normal (pour les modes de programmation uniquement).Il se peut que quelque chose dans ce sens puisse être ajouté à Emacs par défaut, mais il peut s'agir d'une solution provisoire au problème principal d'Emacs qui ralentit son analyse lorsqu'il rencontre un tel fichier.
nb Il s'agit d'une amélioration par rapport au code que j'ai initialement publié dans cette réponse, mais qui reste un travail en cours. Les tests ont été minimes. Les commentaires sont les bienvenus.
Les suggestions concernant d'autres modes principaux (en plus
css-mode
) nonprog-mode
dérivés à prendre en charge par défaut sont également les bienvenues.la source
so-long.el
actif a ouvert le fichier en moins de 2 secondes. En fait, éditer le fichier pose toujours énormément de problèmes (par exemple essayer de passer à la "ligne suivante" prendra très longtemps), mais néanmoins, cela me permet de croire de nouveau à l'utilité de la bibliothèque que j'ai écrite. Je devrais donc reprendre mes plans ajoutez-le à GNU ELPA ...so-long.el
(avec de nombreuses améliorations) est incluse dans les versions de développement actuelles d’Emacs 27 et sera disponible (pour les versions antérieures d’Emacs) via GNU ELPA dans un avenir proche.Je suppose que vous constaterez que la différence est due à
font-lock
. Lorsque la fontification doit être effectuée sur le sous-ensemble du fichier visible dans la fenêtre, elle commence par étendre la région de fontification de manière à inclure des unités sémantiques complètes. Voir lefont-lock-extend-region-functions
code pour cela. Il est courant que cela inclue l'extension de la région pour inclure des lignes complètes. Lorsque les lignes sont extrêmement longues, la fontification peut être effectuée sur un bloc de contenu beaucoup plus volumineux que ce qui est réellement visible.De plus, lorsque les nouvelles lignes contiennent elles-mêmes des informations sémantiques, leur absence peut parfois signifier que les modèles d'expressions rationnelles pour le verrouillage de police doivent analyser davantage afin de déterminer s'ils correspondent ou non.
la source
Je déroule généralement de longues lignes et indente par balises (comme HTML, XML, JSON).
Afin de rendre cette opération possible, j'ajoute:
Je coupais ligne par regex, pour XML il:
C-M-% >< RET >NL< RET !
.Après qu'Emacs ait divisé de longues lignes, il est possible d'activer de nombreux
*-modes
codes et des codes de réindentation.Pour la note: Comment empêcher le ralentissement lorsqu'un processus inférieur génère de longues lignes?
la source
J'ai créé ma propre solution à ce problème ici: https://github.com/rakete/too-long-lines-mode
Je n'étais pas satisfait de la solution phils qui bascule un tampon avec de très longues lignes en mode fondamental. Je recherchais une solution me permettant de conserver la coloration syntaxique et d'autres fonctionnalités en mode majeur. J'ai donc créé un mode mineur qui utilise des incrustations pour masquer la plupart des caractères de lignes trop longues.
Cela contourne le problème et rend emacs utilisable même dans les tampons avec de très longues lignes, sans avoir à revenir en mode fondamental.
la source
Dans ma configuration Emacs, j'ai un mode avec une fontification personnalisée, c'est-à-dire où je le fixe
font-lock-defaults
. Une seule page vers le bas prendrait 30 secondes pour afficher une partie de la ligne 30000 caractères. Ce ralentissement a été corrigé en réduisant le retour arrière des expressions rationnelles. Au lieu de:fais ça
la source
font-lock-defaults
ou ne correspond pas à l' expression rationnelle.Dans mes mémoires tampons en mode shell (shell Mx), je me retrouve
sed -r 's/(.{2000}).*/\1/' -u
à contourner pour éviter les longues lignes.la source
J'utilise la fonction suivante pour ouvrir de
dired-mode
gros fichiers avec de longues lignes:la source
Voici une solution de contournement, tirée d’ emacs-devel :
la source
longlines-mode
été marqué comme obsolète parvisual-line-mode
.visual-line-mode
pas à résoudre le problème en question, alorslonglines-mode
. Pour cette raison, je m'attends à ce que longlines.el soit restauré à un statut non obsolète.