Быстрый режим оболочки emacs?

Я запускаю интерактивную программу, которая выводит около 10 МБ [редактировать: на самом деле, вероятно, ближе к 100 МБ] текста ASCII. Производительность в режиме оболочки emacs (Aquamacs) неприемлемо низкая, для этого требуются часы. Я выполнил команду buffer-disable-undo, что немного ускорило процесс, но все равно слишком медленно.

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

Есть ли какая-то команда, которую я могу дать emacs, чтобы сделать производительность приемлемой? Я не понимаю, как вообще возможно, чтобы режим оболочки был таким медленным: это многоядерная машина на 32 ГБ с 64-битными современными многоядерными процессорами и SSD.


person kdog    schedule 18.11.2014    source источник
comment
Можешь подробно рассказать о своей ситуации, главное, как именно ты запускаешь эту программу? Например. через M-x compile или в буфере M-x shell или...?   -  person Stefan    schedule 18.11.2014
comment
Я создаю буфер с оболочкой M-x. Я выполняю буфер-отключение-отмену в этом буфере. Я запускаю lldb внутри буфера, а внутри lldb запускаю свою программу. Он много печатает, так как находится в стадии разработки, и мне нравится следить за выводом; именно поэтому он должен быть интерактивным. Это обычный нормальный способ разработки под emacs - это одно из преимуществ режима оболочки, вам не нужны все время отдельные файлы журналов. Это будет работать нормально, за исключением того, что emacs работает смехотворно, смехотворно медленно.   -  person kdog    schedule 20.11.2014


Ответы (2)


Установите для переменных comint-move-point-for-output и comint-scroll-show-maximum-output значение nil. Это предотвращает непрерывную прокрутку буфера до конца вывода, что требует частых повторных отображений.

person Barmar    schedule 18.11.2014
comment
Еще не пробовал, не уверен, стоит ли мне это делать, пока печатается вывод. Однако вывод идет медленно, даже если окно буфера не показывает конец вывода. Например, прямо сейчас буфер показывает, что я нахожусь примерно на строке 2 000 000, а вывод буферизуется примерно со строки 2 200 000. Все, что я вижу, это индикатор полосы прокрутки, медленно движущийся вверх. Ничего не перерисовывается. Хотя, возможно, результат ближе к 50 МБ, чем к 10 МБ, чего бы это ни стоило. - person kdog; 18.11.2014
comment
В таком случае, я думаю, ты делаешь все, что можешь. Он должен иметь дело с выводом, чтобы он мог обновлять полосу прокрутки и процент строки режима. Я думаю, что есть переменная, которая указывает максимальный размер буфера для отображения позиции и процента в строке режима, но я не могу вспомнить, что это такое. - person Barmar; 18.11.2014
comment
Спасибо. Меня так расстраивает, что сопровождающие emacs, кажется, тратят все свое время на идиотские функции, которые никому не нужны и не нужны, такие как просмотр веб-страниц, а основные инструменты, для которых люди используют emacs (программирование), глючат или ненадежны. Приличного режима C++ до сих пор нет, например, всего 50 разных пакетов, которые невозможно установить и на самом деле не работают (по моему опыту). Если они хотят установить веб-браузер, хорошо, но СНАЧАЛА заставьте основные вещи работать: просмотр кода, разработка программ и т. д. - person kdog; 18.11.2014
comment
Emacs — один из старейших и самых популярных проектов с открытым исходным кодом. Он поддерживается пользователями, у него есть те функции, которые им нужны. - person Barmar; 18.11.2014
comment
Отображение непрерывного вывода многомегабайтных файлов не является обычным делом. Это вряд ли основные вещи. - person Barmar; 18.11.2014
comment
Дело не только в мегабайтах. В оболочке emacs просмотр каталога с 1000 файлами — ОЧЕНЬ медленный процесс (20 секунд), если только оболочка не запущена. Такое ощущение, что по мере старения оболочки она начинает прокручиваться все медленнее, даже если вы сохраняете буфер коротким, удаляя то, что больше не интересно. - person Silvio Levy; 14.07.2015
comment
@SilvioLevy У вас установлен comint-buffer-maximum-size? Это требует, чтобы он продолжал подсчитывать количество строк и удалять старые строки по мере добавления новых, что может замедлить его работу. - person Barmar; 14.07.2015
comment
он установлен, но не актуален, потому что я не выполняю усечение буфера -- мои функции фильтра comint-output-filter содержат только (ansi-color-process-output comint-postoutput-scroll-to-bottom comint-watch-for-\ запрос пароля), а не comint-truncate-buffer. Кроме того, скорость вывода на новой оболочке контрастирует с собачьей медлительностью оболочки, которая имеет 1000 строк вывода (даже если в настоящее время я убил их все). Это говорит о том, что проблема в том, что мусор хранится, а не выбрасывается. - person Silvio Levy; 14.07.2015

Ваша интерактивная программа работает в режиме оболочки как сценарий оболочки?

Можно ли разветвить процесс оболочки непосредственно в оболочке (не в режиме оболочки в emacs), а затем заставить emacs просто загружать результаты по завершении?

person Chris McMahan    schedule 19.11.2014
comment
См. предыдущий комментарий. Я всегда мог бы переписать свою программу, чтобы обойти проблемы с emacs, но я бы этого не хотел. Я ожидаю, что после 30 или 40 лет разработки у emacs появится способ сделать достаточно быстрый режим оболочки. - person kdog; 20.11.2014