OI常用讀入方式效率測試

2022-05-04 22:51:10 字數 1776 閱讀 5324

我來填坑了。

這次我用自己寫的測試讀入的程式來分別測試cin(不關閉流同步),scanf和讀入優化的效率差別。

我們分別對三個階段的資料量n進行測試,通過時間比對來觀察效能的差異。

n = 102時

n = 104時

n = 105時

為了保證測試準確並且減小偶然誤差,本次測試的所有資料均為隨機數。

對於每乙個資料量連續測試五組不同的隨機數,取平均值作為參考。

隨機數生成器:

1 #include2 #include3 #include4

#define random(x) (rand()%x)

5const

int n = 100;6

intmain()

一號選手cin:

1 #include2 #include3 #include4

using

namespace

std;

5const

int n = 100;6

intx;

7int

main()

二號選手scanf:

1 #include2 #include3 #include4

using

namespace

std;

5const

int n = 100;6

intx;

7int

main()

三號選手讀入優化:

1 #include2 #include3 #include4

using

namespace

std;

5const

int n = 100;6

intx;

7 inline int

read()

1920

intmain()

進行測試。結果如下表

在n = 100的資料量下,表現的都還不錯,那麼n = 10^4的時候將會如何呢?

雖然這樣的時間差肉眼很難分辨,但是差距還是的確存在的。

讀入優化佔據上風,拿到了平均0.0128s的成績。scanf也不甘示弱,平均讀入時間有0.0374s。但cin就比較慘了,只有0.0688s。

很清楚的可以看出,三種讀入方式已經開始有了差別。

那麼在資料量較大的10^5,三種讀入方式會有怎樣的表現呢?

測試發現

至此,三種讀入方式的速度差異已見分曉。

scanf平均0.384s,比讀入優化的0.142s慢了一些。

cin這個時候已經gg了,0.7344s,如果是單點時限1s的題,光讀入就會耗掉超過七成的時間。如果演算法不夠優,可能就會tle。

即使資料量很大,讀入優化也是還能保證到能在很短時間內讀取大量資料,所以可以說是當之無愧的「黑科技」了。

今天比較晚了,本來還想簡要提一下scanf和cin 的原理並且分析速度慢的原因的,看來只能放在以後了。

明天更新夏令營day4知識點整理。

幾種讀入方式

字串讀入 1.getline cin,s string讀入,遇到換行符停止,先使用了cin或scanf輸入資料然後再使用getline時,需使用getchar接收後面的換行符 2.fgets s,maxn,stdin char陣列讀入,遇到換行符停止 3.cin char陣列和string均可讀入,...

比「讀入優化」更優的讀入方式

序 相信很多oier在讀取大量資料的時候普遍採取讀入優化的方式讀入 如下,基本類似 inline void read 無符號型 return input return 通過其他部落格我們發現比這樣更快的是fread,可惜不會用 經過尋找,在知乎上找到了比讀入優化更快的方法。測試表明比讀入優化快10 ...

比「讀入優化」更優的讀入方式

序 相信很多oier在讀取大量資料的時候普遍採取讀入優化的方式讀入 如下,基本類似 inline void read 無符號型 return input return 通過其他部落格我們發現比這樣更快的是fread,可惜不會用 經過尋找,在知乎上找到了比讀入優化更快的方法。測試表明比讀入優化快10 ...