Ускорение вывода текста на Windows, для консоли - PullRequest
1 голос
/ 19 декабря 2008

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

Текущий код структурирован так, что окно живет своей маленькой жизнью, а основной поток приложения ведет его через вызовы SendMessage (). Эта передача сообщений, кажется, является причиной невероятных накладных расходов. По сути, обход по ОС кажется неправильным.

Обратите внимание, что мы рисуем текстовые линии в целом, где это уместно, так что простая оптимизация уже выполнена.

Я не эксперт в кодировании Windows, поэтому мне нужно спросить сообщество, есть ли какая-то другая архитектура для управления отображением текста в окне, кроме отправки таких сообщений? Кажется, довольно тяжеловес.

Обратите внимание, что это на C ++ или обычном C, поскольку основным приложением является переносимая программа на C / C ++ / некоторых других языках, которая также работает на Linux и Solaris.

Мы провели еще несколько расследований, похоже, половина служебных данных готовит и отправляет каждое сообщение с помощью SendMessage, а другая половина - это фактический чертеж экрана. SendMessage выполняется между функциями в одном файле ...

Так что я думаю, что все советы, приведенные ниже, верны:

  • Посмотрите, сколько всего перерисовано
  • Рисуй вещи прямо
  • Операции рисования фрагментов во времени, чтобы не отправлять каждый символ на экран, с целью увеличения частоты обновления последовательной консоли от 10 до 20 Гц.

Можете ли вы принять ВСЕ ответы?

Ответы [ 4 ]

1 голос
/ 19 декабря 2008

Являются ли выходные окна частью одного и того же приложения? Похоже, они не ...

Если это так, вам следует обратиться к шаблону Observer , чтобы уйти от SendMessage (). Я использовал его для того же типа использования, и он прекрасно работал для меня.

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

1 голос
/ 19 декабря 2008

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

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

1 голос
/ 19 декабря 2008

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

Вы описываете это «окна текстовой консоли», но затем говорите, что у вас их несколько - на самом деле это консоли Windows? Или это то, что рисует ваше приложение?

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

0 голосов
/ 19 декабря 2008

Являются ли выходные окна частью такое же приложение? Это почти звучит как будто они не ...

Да, все в одном процессе.

Я не писал этот код ... но кажется, что SendMessage немного тяжел для всего этого в одном случае приложения.

Вы описываете это 'текстовая консоль окна ", но потом скажите, что у вас есть их много - они на самом деле Консоли Windows? Или они что-то ваше приложение рисует?

Наше приложение их рисует, это не обычные консоли Windows.

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

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

Хороший вопрос. Прямо сейчас каждый вывод одного символа приводит к отправке сообщения.

И когда мы прокручиваем окно вверх, когда появляется новая строка, мы перерисовываем его построчно.

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

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