Я вижу сильно различающуюся производительность в зависимости от того, сколько новых строк есть в файле, который я посещаю.
Вот пример. У меня есть два файла 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
Это два файла JSON с одинаковым содержимым. one_line.json
составляет 18 МБ JSON без каких-либо новых строк. pretty_printed.json
добавлены символы новой строки и пробелы, что делает его 41MiB.
Однако больший размер файла, разбитый на несколько строк, намного быстрее открывается в Emacs, как в режиме Javascript, так и в основном режиме.
Почему Emacs имеет такую низкую производительность с длинными строками, поскольку на самом деле меньше байтов? Что я могу сделать, чтобы улучшить производительность, не переформатируя данные вне Emacs?
line-break
performance
Уилфред Хьюз
источник
источник
View Large Files
полезным : (vlf) - второстепенный режим, который предназначен для помощи при редактировании больших файлов путем их загрузки в пакетном режиме . Отказ от ответственности: я никогда не использовал это, и я не знаю, обрабатывает ли это также длинные строки партиями .$ tail -f /some/file | fold -s
буфера оболочки. Очевидно, что это плохо для редактирования, но очень помогает при чтении.Ответы:
Обработка длинных строк в Emacs не очень хорошо оптимизирована. Для ряда операций Emacs должен многократно сканировать всю строку. Например, чтобы отобразить строку, Emacs должен вычислить высоту строки, что требует сканирования всей строки, чтобы найти самый высокий глиф. Кроме того, сканирование для двунаправленного отображения отнимает много времени. Вы можете получить дополнительную информацию, например, в строке документации
cache-long-line-scans
(переименованнойcache-long-scans
в 24.4).Вы можете попробовать и посмотреть , если установка
bidi-paragraph-direction
дляleft-to-right
улучшает скорость для вас [заходящегоbidi-display-reordering
кnil
, делает более или менее то же самое , но предназначен только для внутренних целей / отладки]. Это удаляет один значительный вклад в сканирование строк, но, к сожалению, не единственный.Лучший вариант - добавить новые строки. Вы можете передать JSON-файл через, например,
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
добавить новые строки и улучшить читаемость в целом.источник
(setq-default bidi-display-reordering nil)
- некоторые пользователи могут не осознавать, что это локальная переменная буфера, которая может нуждаться в настройке по умолчанию, если пользователь хочет, чтобы она была глобальной. Я бы хотел добавить это к моимinit.el
годам назад ... но, по крайней мере, сейчас. Огромное спасибо!!!bidi-display-reordering
: «У меня есть один комментарий: отключение переупорядочивания двунаправленного отображения… переводит механизм отображения в состояние, которое не тестируется, и может вызвать несоответствия и даже ошибки (потому что некоторые части кода были написаны в предположении, что эта переменная никогда не равна нулю). "Я провел несколько кратких экспериментов с этим, используя уменьшенную копию jquery.
font-lock-mode
иflycheck-mode
оба способствовали медлительности, как иjs2-mode
, иprettify-symbols-mode
.line-number-mode
иcolumn-number-mode
имел незначительный эффект. Однажды я отключил все разные режимы, хотя производительность была относительно быстрой. Используйте C-h mи начните отключать различные режимы, которые включены, или попробуйте просто переключиться наfundamental-mode
.Интересно, что с помощью
hexl-mode
я мог пролистать файл без каких-либо проблем, хотя, очевидно, столбцы были довольно короткими. К сожалению,visual-line-mode
действительно все замедлилось.Я предполагаю, что таблица синтаксиса готова прекратить обработку в конце строки, а когда она находится в одной строке, она должна анализировать все при каждом обновлении.
источник
Я загрузил http://www.emacswiki.org/emacs/OverLongLineMode
Эта библиотека позволяет вам устанавливать простые пороговые значения длины строки, после которых вариант
fundamental-mode
будет использоваться для файла вместо его обычного режима (только для режимов программирования).Потенциально что-то в этом роде может быть добавлено в Emacs по умолчанию, но это может быть временным обходным решением для основной проблемы замедления Emacs до сканирования при обнаружении такого файла.
nb Это улучшение кода, который я изначально разместил в этом ответе, но все еще в стадии разработки. Тестирование было минимальным. Комментарии приветствуются.
Также приветствуются предложения для других (помимо
css-mode
)prog-mode
основных типов, не являющихся производными, для поддержки по умолчанию.источник
so-long.el
активным открыл файл менее чем за 2 секунды. На самом деле редактирование файла по-прежнему чрезвычайно проблематично (например, попытка перейти к «следующей строке» займет очень много времени), но, тем не менее, это восстанавливает мою веру в полезность библиотеки, которую я написал, поэтому я должен возобновить свои планы по добавить его в GNU ELPA ...so-long.el
(с многочисленными улучшениями) включена в текущие версии разработки Emacs 27 и будет доступна (для более ранних версий Emacs) через GNU ELPA когда-нибудь в ближайшем будущем.Я ожидаю, что вы обнаружите, что разница связана с
font-lock
. Когда фонификация должна быть выполнена для подмножества файла, который виден в окне, она сначала расширяет область фонификации так, чтобы она включала полные семантические единицы. Смотритеfont-lock-extend-region-functions
код для этого. Обычно это включает в себя расширение области для включения полных строк. Когда строки очень длинные, это может привести к тому, что фонификация будет выполняться по гораздо большему фрагменту контента, чем на самом деле видно.Кроме того, когда сами новые строки имеют семантическую информацию, их отсутствие может иногда означать, что шаблоны регулярных выражений для блокировки шрифта должны сканироваться дальше, чтобы определить, соответствуют ли они или нет.
источник
Я обычно развертываю длинные строки и делаю отступ по тегам (например, HTML, XML, JSON).
Чтобы сделать такую операцию возможной, я добавляю:
Я разделил линию регулярных выражений для XML этого:
C-M-% >< RET >NL< RET !
.После того, как Emacs разделит длинные строки - можно включить множество
*-modes
и заново сделать отступ кода.Для заметки: как предотвратить замедление, когда низшие процессы генерируют длинные строки?
источник
Я создал собственное решение этой проблемы здесь: https://github.com/rakete/too-long-lines-mode
Я не был удовлетворен решением phils, которое переключает буфер с очень длинными строками в основной режим, я хотел решение, которое позволит мне сохранять подсветку синтаксиса и другие функции основного режима. Поэтому я создал вспомогательный режим, который использует наложения, чтобы скрыть большинство символов слишком длинных строк.
Это решает проблему и делает emacs пригодным для использования даже в буферах с очень длинными строками, без необходимости возврата к основному режиму.
источник
В моей установке Emacs У меня есть режим с пользовательскими, то есть подсветка не делается , где я поставил
font-lock-defaults
. Одна страница вниз будет использовать 30 секунд для отображения части строки 30000 символов. Это замедление было исправлено путем уменьшения обратного отслеживания регулярных выражений. Вместо:сделай это
источник
font-lock-defaults
или соответствия регулярному выражению.В моих буферах режима оболочки (оболочка Mx) я обнаруживаю, что стараюсь
sed -r 's/(.{2000}).*/\1/' -u
избегать длинных строк.источник
Я использую следующую функцию для открытия
dired-mode
больших файлов с длинными строками:источник
Вот обходной путь, взятый из emacs-devel :
источник
longlines-mode
помечены как устаревшиеvisual-line-mode
.visual-line-mode
не помогают с рассматриваемой проблемой, в то время какlonglines-mode
делает. По этой причине я ожидаю, что longlines.el будет восстановлен в статусе, не являющемся устаревшим.