Veo un rendimiento muy variado dependiendo de cuántas líneas nuevas haya en el archivo que estoy visitando.
Aquí hay un ejemplo. Tengo dos archivos 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
Estos son dos archivos JSON con el mismo contenido. one_line.json
es 18MiB de JSON sin ninguna línea nueva. pretty_printed.json
tiene nuevas líneas y espacios en blanco agregados, lo que lo hace 41MiB.
Sin embargo, el archivo más grande dividido en muchas líneas es mucho más rápido de abrir en Emacs, tanto en modo Javascript como en modo Fundamental.
¿Por qué Emacs tiene un rendimiento tan pobre con líneas largas, ya que en realidad son menos bytes? ¿Hay algo que pueda hacer para mejorar el rendimiento sin reformatear los datos fuera de Emacs?
line-break
performance
Wilfred Hughes
fuente
fuente
View Large Files
(vlf) es un modo menor que tiene como objetivo ayudar a editar archivos grandes cargándolos en lotes . Descargo de responsabilidad: nunca lo he usado y no sé si también maneja líneas largas en lotes .$ tail -f /some/file | fold -s
en un búfer de shell. Obviamente, esto no es bueno para editar, pero ayuda mucho con la lectura.Respuestas:
El manejo de Emacs de líneas largas no está muy bien optimizado. Para una serie de operaciones, Emacs tiene que escanear la línea completa repetidamente. Por ejemplo, para mostrar una línea, Emacs tiene que calcular la altura de la línea, lo que requiere escanear toda la línea para encontrar el glifo más alto. Además, el escaneo en busca de visualización bidireccional consume mucho tiempo. Puede obtener información adicional en, por ejemplo, la cadena de documentos de
cache-long-line-scans
(renombradacache-long-scans
en 24.4).Puede intentar ver si la configuración
bidi-paragraph-direction
deleft-to-right
mejora la velocidad para usted [la configuraciónbidi-display-reordering
denil
, hace más o menos lo mismo, pero solo está destinada a fines internos / de depuración]. Esto elimina un contribuyente significativo a los escaneos de línea, pero lamentablemente no es el único.La mejor opción es agregar nuevas líneas. Puede canalizar un archivo JSON, por ejemplo,
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
para agregar nuevas líneas y mejorar la legibilidad en general.fuente
(setq-default bidi-display-reordering nil)
- algunos usuarios pueden no darse cuenta de que esta es una variable local de búfer, que puede necesitar una configuración predeterminada en la medida en que un usuario quiera que esto sea global. Desearía haber agregado eso a misinit.el
años atrás ... pero al menos está ahí ahora. ¡¡¡Muchas gracias!!!bidi-display-reordering
: "Un comentario que tengo es que deshabilitar la reordenación de visualización bidireccional ... pone el motor de visualización en un estado que no se está probando y puede causar inconsistencias e incluso errores (porque algunas partes del código se escribieron bajo el supuesto de que esta variable nunca es nula) ".Hice algunos experimentos breves con esto usando una copia minificada de jquery.
font-lock-mode
yflycheck-mode
ambos contribuyeron a la lentitud, como lo hizojs2-mode
, yprettify-symbols-mode
.line-number-mode
ycolumn-number-mode
tuvo un efecto menor. Una vez que apagué todos los modos diferentes, aunque el rendimiento fue relativamente rápido. Use C-h my comience a deshabilitar los diferentes modos que están habilitados, o intente simplemente cambiar afundamental-mode
.Curiosamente
hexl-mode
, podría volar a través del archivo sin ningún problema, aunque obviamente las columnas eran bastante cortas. Desafortunadamente,visual-line-mode
realmente ralentizó las cosas.Supongo que la tabla de sintaxis se complace en detener el procesamiento en los finales de línea, y cuando todo está en una línea, tiene que volver a analizar todo en cada actualización.
fuente
He subido http://www.emacswiki.org/emacs/OverLongLineMode
Esta biblioteca le permite establecer umbrales simples de longitud de línea más allá de los cuales
fundamental-mode
se utilizará una variante de para un archivo en lugar de su modo normal (solo para modos de programación).Potencialmente, algo por el estilo podría agregarse a Emacs de forma predeterminada, pero esto puede ser una solución provisional para el problema principal de Emacs que se ralentiza al encontrar un archivo de este tipo.
nb Esta es una mejora sobre el código que publiqué inicialmente en esta respuesta, pero sigue siendo un trabajo en progreso. Las pruebas han sido mínimas. Los comentarios son bienvenidos.
También se aceptan sugerencias para otros (además
css-mode
)prog-mode
modos principales no derivados para admitir por defecto.fuente
so-long.el
active abrió el archivo en menos de 2 segundos. En realidad, editar el archivo sigue siendo muy problemático (por ejemplo, tratar de pasar a la 'siguiente línea' tomará un tiempo extremadamente largo), pero sin embargo, esto restaura mi fe en la utilidad de la biblioteca que escribí, por lo que debería reanudar mis planes para agréguelo a GNU ELPA ...so-long.el
(con numerosas mejoras) se incluye en las versiones de desarrollo actuales de Emacs 27, y estará disponible (para versiones anteriores de Emacs) a través de GNU ELPA en algún momento cercano.Espero que encuentres que la diferencia se debe a
font-lock
. Cuando se va a realizar la fuente en el subconjunto del archivo que está visible en la ventana, se procede primero extendiendo la región de fuente de manera que incluya unidades semánticas completas. Vea elfont-lock-extend-region-functions
código para esto. Es común que esto incluya extender la región para incluir líneas completas. Cuando las líneas son extremadamente largas, esto puede llevar a que la fuente se realice en una porción de contenido mucho más grande de lo que es realmente visible.Además, cuando las nuevas líneas tienen información semántica, su ausencia a veces puede significar que los patrones regexp para el bloqueo de fuentes tienen que escanear más para determinar si coinciden o no.
fuente
Por lo general, desenrollo líneas largas y sangría por etiquetas (como HTML, XML, JSON).
Para hacer posible tal operación, agrego:
Me dividir la línea de expresiones regulares, para XML que:
C-M-% >< RET >NL< RET !
.Después de que Emacs separe las líneas largas, es posible habilitar muchos
*-modes
y volver a sangrar el código.Para la nota: ¿Cómo prevenir la desaceleración cuando un proceso inferior genera largas filas?
fuente
Creé mi propia solución para este problema aquí: https://github.com/rakete/too-long-lines-mode
No estaba satisfecho con la solución phils que cambia un búfer con líneas muy largas al modo fundamental, quería una solución que me permitiera mantener el resaltado de sintaxis y otras características del modo principal. Así que creé un modo menor que usa superposiciones para ocultar la mayoría de los caracteres de líneas demasiado largas.
Eso soluciona el problema y hace que emacs sea utilizable incluso en buffers con líneas muy largas, sin tener que volver al modo fundamental.
fuente
En mi configuración de Emacs tengo un modo con fuente personalizada, es decir, donde configuro
font-lock-defaults
. Una sola página hacia abajo usaría 30 segundos para mostrar parte de la línea de 30000 caracteres. Esta ralentización se solucionó reduciendo el retroceso regexp. En lugar de:hacer esto
fuente
font-lock-defaults
coincidencia de expresiones regulares.En mis búferes de modo shell (shell Mx), me encuentro con tuberías
sed -r 's/(.{2000}).*/\1/' -u
para evitar largas colas.fuente
Utilizo la siguiente función para abrir
dired-mode
archivos grandes con líneas largas:fuente
Aquí hay una solución, tomada de emacs-devel :
fuente
longlines-mode
se marcó como obsoletovisual-line-mode
.visual-line-mode
no ayudan con el problema en cuestión, mientras que lolonglines-mode
hacen. Por esta razón, espero que longlines.el se restablezca a un estado no obsoleto.