увеличить буфер для cout

Ссылаясь на Влияет ли setbuf() на cout?

Я хочу увеличить размер буфера, чтобы повысить производительность cout (обычно он перенаправляется на диск)

Я могу сделать:

std::cout.rdbuf()->pubsetbuf(some_buffer, buffer_size);

А также

ios::sync_with_stdio(false);

Имеет ли это смысл?

РЕДАКТИРОВАТЬ: Также я использую несколько потоков, поэтому я надеялся уменьшить потребность в синхронизации.


person jm1234567890    schedule 26.08.2011    source источник
comment
вы можете просто попробовать и сравнить его, чтобы увидеть, имеет ли он смысл. Это довольно специфично для реализации, если это так.   -  person PlasmaHH    schedule 26.08.2011
comment
Буфер std::cout уже оптимизирован для вашей системы. Маловероятно, что вы добьетесь лучшей производительности (но, пожалуйста, попробуйте), даже если вы обнаружите улучшение, это может не отразиться на других системах, поскольку каждая стандартная библиотека будет настроена на эту систему (или, точнее, на файловую систему).   -  person Martin York    schedule 26.08.2011


Ответы (1)


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

Особенно обратите внимание, если в вашем коде много cout ‹‹ endl и попробуйте вместо этого заменить их на cout ‹‹ '\n', если вам не нужен эффект сброса endl.

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

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

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

person PeterSom    schedule 26.08.2011
comment
Замена <<endl на ‹‹'\n'` очень важна. - person Didier Trosset; 26.08.2011
comment
Да, я использую несколько потоков, и я надеялся, что это уменьшит синхронизацию без необходимости вручную добавлять очередь. - person jm1234567890; 26.08.2011
comment
@ Дидье Троссе, да, я не использую endl: P - person jm1234567890; 26.08.2011
comment
После дальнейшего тестирования это имеет небольшое значение для многопоточного случая. около 5%. - person jm1234567890; 28.08.2011