Ускоряем работу консольных окон в Windows

3 декабря 2021
Время на чтение: 5 минут

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

То, что я выяснил, меня несколько удивило. И поэтому я решил поделиться этой информацией, так как думаю, что она может быть полезной кому-то ещё. В этой статье я расскажу о том, как можно сделать работу консольных окон (и некоторых консольных приложений) в ОС Windows немного быстрее.

• • •

Начну с того, что можно сделать со стороны пользователя, то есть того, что применимо к любому консольному приложению. Актуально это для тех приложений, которые выводят в своё окно большое количество текста (тысячи строк).

Оказывается, что вне зависимости от способа, которым программа выводит текст, на скорость вывода в окно консоли очень сильно влияют два параметра в свойствах самого окна: высота буфера экрана, а также высота (количество строк) окна. Чем выше каждое из этих значений, тем ниже будет скорость вывода. На скриншоте окна «Свойства», расположенном ниже, оба этих параметра обведены красными прямоугольниками.

Console window properties

Высота буфера экрана задаёт количество строк текста, которые сохраняются для отображения. То есть то количество выведенного в окно текста, которое будет можно увидеть, прокрутив назад вертикальную полосу прокрутки. По умолчанию это значение равно 9001 (по крайней мере на ОС Windows 10). Максимально возможное значение этого параметра — 9999. Второй параметр (высота окна) задаёт количество строк, которые будут отображаться в окне.

В таблицах ниже можно увидеть, как влияет выбор значения этих параметров на скорость вывода. В качестве теста я написал простой цикл, в котором в окно консоли подряд выводятся 10,000 строк «This is a text». Причём длина строки практически не влияла на скорость вывода (я пробовал выводить несколько строк разной длины). Для первой таблицы значение высоты окна было равно 30, для второй — значение высоты буфера было равно 5000.

Высота буфера 100 200 500 1000 2000 5000 9000
Время работы (секунды) 0.196 0.209 0.263 0.351 0.520 1.028 1.745
Высота окна 10 15 20 25 40 50 62
Время работы (секунды) 0.904 0.936 0.958 1.010 1.286 1.400 1.520

Таким образом, если большая история вывода в окне не требуется, то уменьшение значения высоты буфера окна может повысить скорость вывода в несколько раз! И если приложение выводит в окно очень большое количество текста, то это также может значительно ускорить его работу.

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

И ещё один момент: если свернуть окно, то скорость вывода всегда будет выше. Это объясняется тем, что операционной системе не приходится обновлять само окно при выводе текста. Для свёрнутого окна обновляются лишь данные в его буфере.

• • •

Теперь я хочу рассмотреть эту проблему со стороны программиста. Чтобы снизить затраты на вывод текста в окно консоли и его влияние на производительность всего приложения в целом, нужно постараться свести к минимуму количество обращений к функциям консольного API операционной системы.

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

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