Во многих версиях Emacs, включая GNU, используется один непрерывный массив символов, фактически разделенный на две секции.разделены пробелом.Для вставки пробела сначала перемещается в точку вставки.Вставленные символы заполняют пробел, уменьшая его размер.Если для хранения символов недостаточно места, весь буфер перераспределяется на новый больший размер, а пробелы объединяются в предыдущей точке вставки.
Наивный взгляд на это и говорит, что производительность должна быть низкой из-за всехкопирование связано.Неправильно.Операция копирования невероятно быстра и может быть оптимизирована различными способами.Буферы разрыва также используют преимущества шаблонов использования.Вы можете прыгать по всему окну, прежде чем фокусироваться и вставлять текст.Пробел не перемещается для отображения - только для вставки (или удаления).
С другой стороны, вставка блока символов в начало файла размером 500 МБ и вставка другого в конце является худшим случаем дляподход разрыва, особенно если размер разрыва превышен.Как часто это происходит?
Непрерывные блоки памяти ценятся в средах виртуальной памяти, потому что требуется меньше подкачки.Более того, операции чтения и записи упрощаются, поскольку файл не нужно анализировать и разбивать на другие структуры данных.Скорее, внутреннее представление файла в буфере гэпа идентично диску и может быть оптимально считано и записано.Сами записи могут быть выполнены одним системным вызовом (на * nix).
Буфер с пропуском - лучший алгоритм для редактирования текста в общем виде.Он использует наименьшее количество памяти и обладает самой высокой совокупной производительностью по сравнению с различными вариантами использования.Перевод буфера гэпа в визуальное окно немного сложнее, поскольку контекст строки должен постоянно поддерживаться.