ВозможностиЦеныДокументацияБлог
Получить mote
← Блог
Разработка·5 июля 2026 г.·3 мин чтения

Почему набор текста не замедляется даже в длинных документах

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

m
mote
Две строки измерений после 300 нажатий клавиш в документе объёмом 100 КБ. Отдельно измеряется момент, когда ядро завершило редактирование, повторный разбор и декорирование (p95 — 0,44 мс), и момент, когда результат появился на экране (p95 — 3,32 мс).
Две строки измерений после 300 нажатий клавиш в документе объёмом 100 КБ. Отдельно измеряется момент, когда ядро завершило редактирование, повторный разбор и декорирование (p95 — 0,44 мс), и момент, когда результат появился на экране (p95 — 3,32 мс).

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

Если при каждом нажатии клавиши редактор заново читает весь документ и полностью перестраивает экран, то по мере роста документа замедляется и ввод. Именно поэтому редактор, нормально работавший с заметкой из десяти строк, начинает раздражать при работе с проектным документом на две тысячи строк.

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

При редактировании заново читать и компоновать только изменившийся диапазон. Перечитывать весь документ только при открытии файла.

Перечитывается только изменившаяся часть

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

Поэтому mote запоминает «безопасные точки», в которых влияние предшествующего содержимого гарантированно заканчивается. Когда происходит правка, чтение начинается с ближайшей безопасной точки и прекращается, как только содержимое снова стабилизируется.

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

Парсер следует построчному алгоритму CommonMark и проходит все 652 теста спецификации. Однако при инкрементальной обработке легко допустить незаметную ошибку. Поэтому к случайным документам 3 600 раз применяются случайные правки, после чего каждый результат сравнивается с результатом полного повторного чтения документа.

Эта проверка обнаружила и реальную ошибку. Она возникала, когда безопасная точка и отредактированная строка в точности совпадали.

Принципы производительности обеспечиваются проверками

Цель — p95 в 4 мс от нажатия клавиши до завершения обработки ядром. Превышение этого времени считается не задачей по улучшению, а ошибкой.

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

Производительность тоже не оценивается человеком на глаз. Тестовый стенд вводит символы на реальном экране и измеряет распределение времени обработки. Вместо среднего значения или медианы рассматривается p95. Потому что пользователя раздражает не обычная скорость, а редкие длительные задержки.

Для измерений всегда используется один и тот же фиксированный документ.

Фиксированный документ doc100k.md, используемый тестовым стендом, открыт в режиме реального времени. В строке состояния указаны 96 513 символов и 103 минуты чтения.
Фиксированный документ doc100k.md, используемый тестовым стендом, открыт в режиме реального времени. В строке состояния указаны 96 513 символов и 103 минуты чтения.

Экран тоже обновляется только в необходимом объёме

Сделать инкрементальным только парсер оказалось недостаточно.

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

Теперь подсветка синтаксиса неизменённых блоков используется повторно без изменений. Блоки после места правки только перемещаются в соответствии с изменением количества строк.

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

Есть и исключения

Иногда необходимо заново обработать весь документ.

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

Даже если ядро работает быстро, экрану требуется время на ожидание следующего кадра. На экране с частотой 60 Гц ограничением становится сам интервал между кадрами. Поэтому время обработки ядром и время до фактического появления результата на экране измеряются отдельно, и эти два показателя не помещаются на одну шкалу. Вот почему на обложке показаны две разные строки.

Быстрый редактор — это не редактор, который быстро выполняет всю работу.

Это редактор, который не выполняет работу, которую можно не делать.

← РанееПочему мы доверили отрисовку текста платформе, а не стали рисовать его самиПозже →Чтобы абзацы одинаково отображались и в других инструментах, мы определили правила клавиши Enter
Следите за новостями через RSS.
Оставьте только текст
Русский
© 2026 mote