[英]Usage of output stream buffer in context to std::cout and std::endl
我試圖了解輸出流緩沖區的工作方式。 我找不到任何能解釋在std::cout
上下文中的標准輸出上編寫整個過程的東西。 據我了解, std::cout
實際上不會在標准輸出上打印,而是將內容寫入終端仿真器的輸出流緩沖區。 當緩沖區已滿時,終端仿真器將刪除緩沖區的內容,並將其寫入終端顯示(標准輸出)。 據我說,這是由終端仿真器執行flush
操作時發生的情況。
在std::endl
的情況下,會向終端仿真器發出顯式請求,以立即刷新緩沖區的內容,這會導致性能下降。 造成此下降的原因是我們的程序flush
時間創建了對終端仿真器的flush
請求,並等待緩沖區的內容在終端顯示器上打印,然后再繼續下一行代碼。 沒有std::endl
, std::cout
不在乎立即打印內容。 它將打印責任留給終端仿真器(通過將內容寫入終端仿真器的輸出流緩沖區中)。 我有一些疑問:
(1)我對終端仿真器如何顯示std::cout
要求的文本的理解是否准確?
(2)是否向OS或終端仿真器發出了flush
請求?
(3)如果我們增加了終端仿真器的輸出流緩沖區的大小,那么程序性能的提高是否會與在顯示器上打印內容的明顯延遲相輔相成?
不,您的理解不正確。 至少不直接涉及“終端仿真器”。
輸出緩沖區位於流對象本身內(在這種情況下為std::cout
)。 根據流的緩沖策略,可以使用三種方法使用此緩沖區:
塊緩沖:輸出首先存儲在緩沖區中。 當緩沖區已滿時,它被“清除”,即其內容被寫入基礎(特定於OS)的輸出通道,並清空緩沖區。
行緩沖:類似於塊緩沖,但每當將換行符( '\\n'
)寫入緩沖區時,緩沖區也將被刷新。
Unbuffered:不使用輸出緩沖區。 所有輸出立即寫入。
當您打開文件時,流開始被塊緩沖。 std::cerr
沒有緩沖。 如果輸出到終端,則std::cout
被行緩沖,否則將被塊緩沖。
std::flush
立即刷新輸出緩沖區(如果有的話)。
至於如何實際寫入數據,詳細信息取決於您的操作系統。 在UNIX系統上,有一個稱為write
的系統調用(“系統調用”是對操作系統執行某項操作的請求)。 系統調用通常比普通函數調用慢。 輸出緩沖區是一種性能優化,因為您不想為輸出的每個字符調用write
。 內部收集輸出,直到您要編寫大量文本,這意味着需要減少write
調用,這意味着更好的整體性能。
至於您的具體問題:
不,終端仿真器不相關。
操作系統。
緩沖區位於流對象中,而不是終端仿真器中。 在某些時候,增加緩沖區大小將停止為您提供任何性能優勢。 您的程序通常會花費大部分時間來計算結果和執行其他操作,而不是將文本寫入std::cout
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.