Вывод в консоль

Defder

New member
Code:
L(i) 1..5
    print(i)
    sleep(1.0)
Через пять секунд выводит сразу все цифры.

Предлагаю вызывать flush при каждом выводе в stdout.
 

alextretyak

Administrator
Staff member
А какая у вас операционная система? Не Windows? У меня выводит цифры по одной.

Можете закомментировать строку std::ios_base::sync_with_stdio(false); в файле 11l.hpp [в подкаталоге _11l_to_cpp] и сообщить результат?

Предлагаю вызывать flush при каждом выводе в stdout.
Такой вопрос нужно как минимум выносить на голосование. И решение принимать на основе бенчмарков, показывающих что это не приводит к падению производительности (особенно актуально для задач по спортивному программированию, в которых порой требуется выводить огромные объёмы текста в консоль/stdout).
 

Defder

New member
А какая у вас операционная система?
macOS

Можете закомментировать строку std::ios_base::sync_with_stdio(false); в файле 11l.hpp [в подкаталоге _11l_to_cpp] и сообщить результат?
Так — работает (выводит по одной).

Когда задержка, то она может быть не только 5 секунд, а и 5 минут и более, если текста мало выводится (похоже, выводит при заполнении буфера). Я подумал было, что с синтаксисом не разобрался и что-то не то накодил, так как задача минут на двадцать и всё это время пусто.
 
Last edited:

alextretyak

Administrator
Staff member
Если что, у функции print() есть [недокументированный] аргумент flush:
Code:
print(i, flush' 1B)
А ещё можно сделать так:
Code:
:stdout.flush()
 

Defder

New member
Если я правильно понимаю, текст выводится с буферизацией на любой платформе, но работает эта буферизация по-разному: на Windows (и, возможно, на Linux) буфер сбрасывается часто, а на macOS только при переполнении или завершении программы, не иначе как bug.

Можно и добавить :stdout.flush(), но тогда теряется лаконичность 11l.
 
Last edited:
Top