日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

拾趣——ios::sync_with_stdio(false)详解(提高代码运算速度)

發(fā)布時(shí)間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拾趣——ios::sync_with_stdio(false)详解(提高代码运算速度) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章核心意思:在編程時(shí)cin(cout)比scanf(printf)慢,在代碼里加上ios::sync_with_stdio(false) 這個(gè)語(yǔ)句后,cin(cout)速度就會(huì)變得和scanf(printf)一樣快,降低時(shí)間復(fù)雜度

在競(jìng)賽中,遇到大數(shù)據(jù)時(shí),往往讀文件成了程序運(yùn)行速度的瓶頸,需要更快的讀取方式。相信幾乎所有的C++學(xué)習(xí)者都在cin機(jī)器緩慢的速度上栽過(guò)跟頭,于是從此以后發(fā)誓不用cin讀數(shù)據(jù)。還有人說(shuō)Pascal的read語(yǔ)句的速度是C/C++中scanf比不上的,C++選手只能干著急。難道C++真的低Pascal一等嗎?答案是不言而喻的。一個(gè)進(jìn)階的方法是把數(shù)據(jù)一下子讀進(jìn)來(lái),然后再轉(zhuǎn)化字符串,這種方法傳說(shuō)中很不錯(cuò),但具體如何從沒(méi)試過(guò),因此今天就索性把能想到的所有的讀數(shù)據(jù)的方式都測(cè)試了一邊,結(jié)果是驚人的。

競(jìng)賽中讀數(shù)據(jù)的情況最多的莫過(guò)于讀一大堆整數(shù)了,于是我寫(xiě)了一個(gè)程序,生成一千萬(wàn)個(gè)隨機(jī)數(shù)到data.txt中,一共55MB。然后我寫(xiě)了個(gè)程序主干計(jì)算運(yùn)行時(shí)間,代碼如下:

最簡(jiǎn)單的方法就算寫(xiě)一個(gè)循環(huán)scanf了,代碼如下:

#include <ctime> int main() { int start = clock(); //DO SOMETHING printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC); }

最簡(jiǎn)單的方法就算寫(xiě)一個(gè)循環(huán)scanf了,代碼如下:

int numbers[MAXN]; void scanf_read() { freopen("data.txt","r",stdin); for (int i=0;i<MAXN;i++) scanf("%d",&numbers[i]); }

可是效率如何呢?在我的電腦Linux平臺(tái)上測(cè)試結(jié)果為2.01秒。接下來(lái)是cin,代碼如下

const int MAXN = 10000000; int numbers[MAXN]; void cin_read() { freopen("data.txt","r",stdin); for (int i=0;i<MAXN;i++) std::cin >> numbers[i]; }

出乎我的意料,cin僅僅用了6.38秒,比我想象的要快。cin慢是有原因的,其實(shí)默認(rèn)的時(shí)候,cin與stdin總是保持同步的,也就是說(shuō)這兩種方法可以混用,而不必?fù)?dān)心文件指針混亂,同時(shí)cout和stdout也一樣,兩者混用不會(huì)輸出順序錯(cuò)亂。正因?yàn)檫@個(gè)兼容性的特性,導(dǎo)致cin有許多額外的開(kāi)銷(xiāo),如何禁用這個(gè)特性呢?只需一個(gè)語(yǔ)句std::ios::sync_with_stdio(false);,這樣就可以取消cin于stdin的同步了。程序如下:

const int MAXN = 10000000; int numbers[MAXN]; void cin_read_nosync() { freopen("data.txt","r",stdin); std::ios::sync_with_stdio(false); for (int i=0;i<MAXN;i++) std::cin >> numbers[i]; }

取消同步后效率究竟如何?經(jīng)測(cè)試運(yùn)行時(shí)間銳減到了2.05秒,與scanf效率相差無(wú)幾了!有了這個(gè)以后可以放心使用cin和cout了。
接下來(lái)讓我們測(cè)試一下讀入整個(gè)文件再處理的方法,首先要寫(xiě)一個(gè)字符串轉(zhuǎn)化為數(shù)組的函數(shù),代碼如下

const int MAXS = 60*1024*1024; char buf[MAXS]; void analyse(char *buf,int len = MAXS) { int i; numbers[i=0]=0; for (char *p=buf;*p && p-buf<len;p++) if (*p == ' ') numbers[++i]=0; else numbers[i] = numbers[i] * 10 + *p - '0'; }

把整個(gè)文件讀入一個(gè)字符串最常用的方法是用fread,代碼如下:

const int MAXN = 10000000; const int MAXS = 60*1024*1024; int numbers[MAXN]; char buf[MAXS]; void fread_analyse() { freopen("data.txt","rb",stdin); int len = fread(buf,1,MAXS,stdin); buf[len] = '\0'; analyse(buf,len); }

上述代碼有著驚人的效率,經(jīng)測(cè)試讀取這10000000個(gè)數(shù)只用了0.29秒,效率提高了幾乎10倍!掌握著種方法簡(jiǎn)直無(wú)敵了,不過(guò),我記得fread是封裝過(guò)的read,如果直接使用read,是不是更快呢?代碼如下:

const int MAXN = 10000000; const int MAXS = 60*1024*1024; int numbers[MAXN]; char buf[MAXS]; void read_analyse() { int fd = open("data.txt",O_RDONLY); int len = read(fd,buf,MAXS); buf[len] = '\0'; analyse(buf,len); }

END!!!!!!!!!!!!!!!!!!!!

總結(jié)

以上是生活随笔為你收集整理的拾趣——ios::sync_with_stdio(false)详解(提高代码运算速度)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。