2015-12-01 77 views
4

出於某種原因,我不能讓我的輸出流運行任何與線C++ IO流sync_with_stdio沒有區別

std::ios_base::sync_with_stdio(false); 

包括在我的節目的開始更快。我用這兩個程序測試此:

#include <iostream> 

int main() { 
    for (int i = 0; i < 500000; i++) 
     std::cout << "Hello World\n"; 
} 

#include <iostream> 

int main() { 
    std::ios_base::sync_with_stdio(false); 
    for (int i = 0; i < 500000; i++) 
     std::cout << "Hello World\n";  
} 

運行時間爲每個程序如下

first_test(同步)

real 0m1.095s 
user 0m0.472s 
sys  0m0.299s 

second_test (同步關閉)

real 0m1.091s 
user 0m0.471s 
sys  0m0.299s 

我在用g ++ -O3 main.cpp編譯。我在運行10.11.1的Mac上。

有什麼辦法讓sync_with_stdio關閉來讓輸出流更快地執行?

+1

你重定向了輸出嗎?還是讓它打印到終端? –

+0

這似乎很慢,你確定你在測量正確的東西嗎?您的操作系統花費多少時間來完成該過程?輸出在哪裏?那是緩衝的嗎?是否打印到終端,這會增加比與stdio同步更多的開銷?在你試圖加速它之前,你應該確定你正在測量正確的東西。 –

+0

我重新測量了它重定向到一個文件而不是終端。我也測試了cstdio printf(而不是cout)。隨着sync_with_stdio(假)需要\t 0m0.348s與printf的只需要0m0.046s – coder21

回答

3

有什麼辦法讓sync_with_stdio關閉來讓輸出流更快地執行?

不,代碼運行速度並不是強制性的。該選項允許你混合I/O從std::cout/std::cin(和朋友)與I O從stdout/stdin(和朋友)/ /到/:

std::cout << "test"; 
printf("another test"; 

是實現定義是否I/O被緩衝(以及如何),並且實現定義瞭如何實現這個結果。這樣做的後果是它的實現定義了這種機制是否會減慢你的代碼(如果你有任何好處的話)。

你試過了,你的情況你的編譯器有一個好的標準庫實現沒有任何可見的價格,以保持這種同步。


這也說明這種測量很難正確實施。你是如何得到這些價值的?此外,相同的測試應重複多次以計算平均值。另外請注意,緩衝本身可能會對此結果產生偏見。請注意,輸出到控制檯也將平坦您的結果。最後說明:我也嘗試使用比500000更高的值,約1 ms的時間可能不如您所期望的那麼準確。

+2

IIRC的文件流它更明顯。 – edmz

+0

我簡單地使用time命令來測量它。我重定時將輸出重定向到一個文件,並對照cstdio的printf進行測量。 sync_with_stdio(false)花了0m0.348s,但fprint只花了0m0.045s。在我看來,差異不應該是那麼激烈 – coder21

+0

爲什麼不呢? C++流做的遠遠超過一個普通的printf(),在這種簡單的情況更(在這個意義上,沒有什麼別的,而是輸出),那麼你可以_see_這種差別(注意你測量了單杆300毫秒的差異, **它也測量程序加載**,對於C++流,比C風格的I/O有更多的_load_和初始化。一個更好的測試應該避免測量這樣的時間(然後應該在你的程序中執行)。我解釋說:如果你從500000變成5,你可能會看到相同的開銷(340毫秒比40毫秒)。你測量的是**額外開銷和I/O時間** ... –