2014-12-02 81 views
5

首先,我在做std::ios_base::sync_with_stdio(false)。我有以下的代碼段,從文本文件(<input.txt >output.txt)讀一百萬個整數:交替cin/cout慢?

int tests; 
cin >> tests; 
for (int i = 0; i < tests; ++i) { 
    int number; 
    cin >> number; 
    cout << number << "\n"; 
} 

int tests; 
cin >> tests; 
vector<int> numbers(tests); 
for (int i = 0; i < tests; ++i) { 
    cin >> numbers[i]; 
} 
for (int i = 0; i < tests; ++i) { 
    cout << numbers[i] << "\n"; 
} 

當然,在現實中,他們要做的不僅僅是打印相同的數字更多。問題是,第一塊需要大約4倍(6.2秒比1.8)。

在兩種情況下重寫相同的代碼與printf/scanf需要3秒鐘。這背後的原因是什麼?

+7

'cin'領帶和'cout'是['領帶()'d](http://en.cppreference.com/w/cpp/io/basic_ios/ tie)在另一個上調用'flush()'操作。 – 2014-12-02 15:53:34

+0

是不是'sync_with_stdio'應該防止什麼? – riv 2014-12-02 15:55:16

+3

不,這說明了'cout'和'printf'之間的聯繫。不在'cout'和'cin'之間。 – 2014-12-02 15:56:22

回答

3

參見std::basic_ios::tie,特別是包括以下部分:

甲並列流是其與通過流緩存器(rdbuf())控制的序列同步的輸出數據流,即,flush()被稱爲在並列流在*this上進行任何輸入/輸出操作之前。

默認情況下,標準流cincerrclog是綁cout。類似地,它們的廣泛對應物wcin,wcerrwclogwcout聯繫在一起。

問題的關鍵是確保在典型的交互式程序如cout << "Enter something: "; cin >> something;這樣的事情中,在程序等待輸入之前屏幕實際上出現在屏幕上。

但在你的情況下,那些額外的flush()調用會打敗流可能會緩衝的任何緩衝區,從而傷害性能。

可以斷開與cin.tie(nullptr);