2015-06-21 29 views
6

我正在嘗試用C++試圖弄清楚如何儘可能快地打印從0到n的數字。如何在不刷新緩衝區的情況下打印換行符?

起初我只是打印的所有有循環的數字:

for (int i = 0; i < n; i++) 
{ 
    std::cout << i << std::endl; 
} 

不過,我想這會刷新其輸出,也一定必須花費一些時間的每一個號碼後緩衝區,所以我嘗試首先將所有數字打印到緩衝區(或者實際上直到它看起來完全滿了,然後自動刷新),然後一次沖洗。然而,它似乎打印\ n刷新後像STD緩衝區:: ENDL所以我忽略它:

for (int i = 0; i < n; i++) 
{ 
    std::cout << i << ' '; 
} 
std::cout << std::endl; 

這似乎跑的比第一個例子快約10倍。不過,我想知道如何將所有值存儲在緩衝區中並一次全部刷新,而不是每次刷新時都讓它刷新,所以我有幾個問題:

  1. 是否可以打印換行符沒有沖洗緩衝區?
  2. 如何更改緩衝區大小,以便我可以將所有值存儲在其中並將其清除到最後?
  3. 這是輸出文字啞的方法嗎?如果是這樣,爲什麼,以及它會是更好的替代方案?

編輯:看來,我的結果是通過一個laggy系統(智能手機的終端應用程序)偏置......有了更快的系統的執行時間沒有顯示出顯著差異。

+0

嘗試在寫入之前在'cout'上取消設置[unitbuf](http://en.cppreference.com/w/cpp/io/manip/unitbuf)標誌。 –

+3

請勿使用'endl',因爲它會強制沖洗等。請使用'\ n''或'「\ n」'代替?或者你可以進入更詳細的技巧,設置'std :: cout'的緩衝模式爲完全緩衝。 –

+0

'std :: cout <<'\ n''打印一個新行。除非有理由,否則不要手動刷新。 – nwp

回答

3

TL; DR:通常,使用'\n'代替std::endl更快,因爲std::endl

說明: std::endl使得緩衝器的沖洗,而'\n'沒有。 但是,根據您應用的測試方法,您可能會也可能不會注意到任何加速。

請看下面的測試文件:

endl.cpp

#include <iostream> 

int main() { 
    for (int i = 0 ; i < 1000000 ; i++) { 
     std::cout << i << std::endl; 
    } 
} 

slashn.cpp

#include <iostream> 

int main() { 
    for (int i = 0 ; i < 1000000 ; i++) { 
     std::cout << i << '\n'; 
    } 
} 

上述這些問題都在我的Linux使用g++編譯的系統並進行以下測試:

1. time ./a.out

對於endl.cpp,它需要19.415s。
對於slashn.cpp,它需要19.312s。

2。time ./a.out >/dev/null

對於endl.cpp,它需要0.397s
對於slashn.cpp,它需要0.153s

3. time ./a.out >temp

對於endl.cpp,它需要2.255s
對於slashn.cpp,需要0.165s

結論:'\n'絕對是更快(甚至實際上),但速度的差異可能取決於其他因素。在終端窗口的情況下,限制因素似乎取決於終端本身可以顯示文本的速度。隨着文本顯示在屏幕上,並且需要自動滾動等,執行過程中會出現大量減速。另一方面,對於普通文件(如上面的temp示例),緩衝區刷新的速率會影響很多。在一些特殊文件(如上面的/dev/null)的情況下,由於數據只是陷入黑洞,沖洗似乎沒有效果。

相關問題