Как реализовать мгновенный, но буферизованный вывод в OCaml? - PullRequest
0 голосов
/ 11 июля 2020

Я пишу интерпретатор Пролога в OCaml и хочу, чтобы он предлагал следующую функцию:

  • Символьный вывод буферизован .

  • Вывод появляется мгновенно , скажем, в течение 0,05 секунды.

  • Нет необходимости использовать явные flush_output/0 операции.

  • Операции очистки буфера выполняются автоматически, но не каждые put_char.

Вот что я придумал:

  • При запуске программы я ...

    • ... устанавливаю обработчик сигналов для SIGALRM и ...
    • ... используйте Unix.setitimer для запуска периодаi c таймер.
  • Таймер - это таймер реального времени (ITIMER_REAL).

  • Таймер срабатывает каждые 0,05 секунды.

  • Все, что делает обработчик сигналов: flush_all ().

Какие у этого есть недостатки?

И если да, то какие у меня есть альтернативы реализации?

1 Ответ

1 голос
/ 11 июля 2020

В основном ваш код постоянно выполняет большую работу, чтобы время от времени пропускать sh символов. Так что это неэффективное использование процессорного времени. Вы можете попробовать запустить top (в системе Unix), чтобы увидеть, сколько ресурсов процессора потребляет этот подход.

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

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

...