關於關閉同步流以加速cin,cout輸入輸出速度

2021-08-22 06:08:16 字數 1466 閱讀 4849

在競賽中,遇到大資料時,往往讀檔案成了程式執行速度的瓶頸,需要更快的讀取方式。相信幾乎所有的c++學習者都在cin機器緩慢的速度上栽過跟頭,於是從此以後發誓不用cin讀資料。還有人說pascal的read語句的速度是c/c++中scanf比不上的,c++選手只能乾著急。難道c++真的低pascal一等嗎?答案是不言而喻的。乙個高階的方法是把資料一下子讀進來,然後再轉化字串,這種方法傳說中很不錯,但具體如何從沒試過,因此今天就索性把能想到的所有的讀資料的方式都測試了一邊,結果是驚人的。

競賽中讀資料的情況最多的莫過於讀一大堆整數了,於是我寫了乙個程式,生成一千萬個隨機數到data.txt中,一共55mb。然後我寫了個程式主幹計算執行時間,**如下:

#include int main()



最簡單的方法就算寫乙個迴圈scanf了,**如下:

const int maxn = 10000000;  

int numbers[maxn];

void scanf_read()

出乎我的意料,cin僅僅用了6.38秒,比我想象的要快。cin慢是有原因的,其實預設的時候,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心檔案指標混亂,同時cout和stdout也一樣,兩者混用不會輸出順序錯亂。正因為這個相容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需乙個語句std::ios::sync_with_stdio(false);,這樣就可以取消cin於stdin的同步了。程式如下:

const int maxn = 10000000;

int numbers[maxn];

void cin_read_nosync()

取消同步後效率究竟如何?經測試執行時間銳減到了2.05秒,與scanf效率相差無幾了!有了這個以後可以放心使用cin和cout了。

接下來讓我們測試一下讀入整個檔案再處理的方法,首先要寫乙個字串轉化為陣列的函式,**如下

const int maxs = 60*1024*1024;

char buf[maxs];

void analyse(char *buf,int len = maxs)

上述**有著驚人的效率,經測試讀取這10000000個數只用了0.29秒,效率提高了幾乎10倍!掌握著種方法簡直無敵了,不過,我記得fread是封裝過的read,如果直接使用read,是不是更快呢?**如下:

const int maxn = 10000000;

const int maxs = 60*1024*1024;

int numbers[maxn];

char buf[maxs];

void read_analyse()

**csdn博主蒝味

iostream輸入輸出流 cin cout

cin是istream類的物件,即c 的標準輸入流物件。主要用於從鍵盤等輸入裝置上讀取資料。其常用的讀取資料流的方法有 cin cin.get cin.getline 1 cin 方式 1 該方式每次讀取資料流時,一旦遇到空格 換行符,則其後的內容都被捨棄無法讀取。只能讀取這些分隔符之前的內容。且首...

關於輸入輸出流的討論

今天看了下c 中的流,試著編寫了程式如下 include include include using namespace std 開始時的程式中向檔案中輸出資料時用的語句為oo st fri data sec data thi data 既沒有換行符,執行的結果如下111222 1073749412...

關於輸入輸出流的理解

前面學習jdk的時候,真的沒理解輸入輸出流的概念,今天上網看了別人的理解,覺得受益非淺,為了以後方便我也把我的理解記錄了下來.主要是從記憶體 磁碟 終端 螢幕 鍵盤 網路之間的闡述。程式操作的資料都應該是在記憶體裡面,記憶體是你操作的主物件,把資料從其他資源裡面傳送到記憶體裡面,就是輸入,反之,把資...