Почему текстовые редакторы работают медленно при редактировании очень длинных строк? - PullRequest
9 голосов
/ 12 сентября 2011

Большинство текстовых редакторов работают медленно, когда строки очень длинные.Предлагаемая структура для хранения данных для текстового редактора выглядит как веревка, которая должна быть защищена от модификации длинных строк.Между прочим, редакторы работают даже медленно при простом перемещении по длинным строкам.

Пример: один символ, такой как 0, повторяется 100000 раз в PSPad или 1000000 раз в Vim на одной строке, когда курсор перемещается, когда вы находитесь наконец линии.Если в файле столько байтов, но оно отправлено в несколько строк, курсор вообще не замедляется, поэтому я полагаю, что это не проблема с памятью.

Какова причина этой распространенной проблемы?

В основном я пользуюсь Windows, может, это связано с обработкой шрифтов Windows?

Ответы [ 3 ]

12 голосов
/ 12 сентября 2011

Возможно, вы используете кодировку переменной длины, например, utf8. Редактор хочет отслеживать, в каком столбце вы находитесь, при каждом перемещении курсора, а в кодировке переменной длины нет ярлыка для сканирования каждого байта, чтобы увидеть, сколько символов существует; с длинной строкой, это много сканирования.

Я подозреваю, что вы не увидите такого замедления при использовании длинных строк с использованием однобайтовой кодировки, такой как iso8859-1 (latin1). Если вы используете однобайтовую кодировку, то длина символа = длина байта, и столбец можно быстро вычислить с помощью простой арифметики указателя. Многобайтовая кодировка фиксированной длины, такая как ucs-2, должна иметь возможность использовать тот же ярлык (просто делить на постоянный размер символа), но редакторы могут быть недостаточно умны, чтобы воспользоваться этим.

1 голос
/ 28 октября 2017

Вы упомянули vim, поэтому я предполагаю, что вы используете редактор. Vim не использует веревку, как описано здесь и здесь . Он использует массив строк, поэтому ваше предположение, что веревки должны быть невосприимчивы к таким длинным линиям, не имеет значения, потому что веревки не используются.

1 голос
/ 20 сентября 2011

Как и предполагал злой оттон , кодирование строки может вызвать повторный анализ строки, а для длинных строк это вызывает всевозможные проблемы с производительностью.

Но это не только кодирование,вызывает повторный анализ строки.

Символы табуляции также требуют сканирования всей строки, поскольку вам необходимо проанализировать всю строку, чтобы вычислить истинное положение курсора.

Определенная подсветка синтаксисаопределения (т. е. блочные комментарии, строки в кавычках и т. д.) также требуют анализа всей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...