以前写过一篇比较scanf与cin的博客,但是那篇博客存在很多bug,测速也很不规范。
今天我收集了一下众大佬的读入优化,来做个比较
特别鸣谢:my,zyh,hzwer,lyq
首先看一下各位大佬的读入优化
my(这是个超级大蒟蒻)
这是我自己yy着写出来的,虽然长得丑,但是也不快
1 inline void read(int &n) 2 { 3 char c=getchar();bool flag=0;n=0; 4 while(c<'0'||c>'9') c=='-'?flag=1,c=getchar():c=getchar(); 5 while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();flag==1?n=-n:n=n; 6 }
zyh:
1 inline void read(int &x) 2 { 3 char ch=getchar();x=0;int f=1; 4 for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; 5 for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';x=x*f; 6 }
学姐的读入优化写法应该是介于我和hzwer之间的,而且用了isdigit黑科技
hzwer
1 inline int read() 2 { 3 int x=0,f=1;char c=getchar(); 4 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} 5 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar(); return x*f; 6 }
AG爷的读入优化,不知道速度怎么样
cin
cin+ios优化
scanf
(我仨是来打酱油的)
fread
1 inline char nc(){ 2 static char buf[100000],*p1=buf,*p2=buf; 3 return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; 4 } 5 inline int read() 6 { 7 char ch=nc();int sum=0;int flag=1; 8 while(!(ch>='0'&&ch<='9')){ch=nc();if(ch=='-')flag=-1;} 9 while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); 10 return sum*flag; 11 }
全网公认最强的IO优化写法
评测环境
就是机房里的电脑
评测方式
随机生成一组数据
测试不同的读入方式对相同的数据的读入速度
一种方式测试3-4次
单位:S
测试1:对于le6的int随机数据读入
cin | 1.716 | 1.711 | 1.823 | 1.705 |
cin+ios | 0.4576 | 0.346 | 0.3471 | 0.3461 |
scanf | 0.4189 | 0.3669 | 0.3714 | 0.3761 |
my | 0.1762 | 0.1499 | 0.1493 | 0.1508 |
zyh | 0.217 | 0.1505 | 0.1504 | 0.1533 |
hzwer | 0.1626 | 0.1519 | 0.1357 | 0.1348 |
fread | 0.2388 | 0.1229 | 0.1257 | 0.1228 |
不难看出,对于1e6的数据读入差距已经非常明显了
测试2:对于1e7的int随机数据读入
cin | 17.01 | 16.93 | 17.13 |
cin+ios | 3.44 | 3.413 | 3.416 |
scanf | 3.606 | 3.583 | 3.575 |
my | 1.478 | 1.419 | 1.418 |
zyh | 1.42 | 1.424 | 1.423 |
hzwer | 1.372 | 1.258 | 1.26 |
fread | 1.161 | 1.14 | 1.14 |
唔。。。和上面的排名基本类似
测试3:对于1e6的long long 随机数据读入
cin | 1.649 | 1.648 | 1.647 |
cin+ios | 0.4287 | 0.3868 | 0.3863 |
scanf | 0.4644 | 0.386 | 0.3819 |
my | 0.1525 | 0.1489 | 0.1499 |
zyh | 0.1563 | 0.1588 | 0.1554 |
hzwer | 0.1548 | 0.1388 | 0.1395 |
fread | 0.1378 | 0.1199 | 0.1253 |
排名并没有发生多大变化...
总结
通过上面三组测试,各种读入方式的快慢已经比较清晰了
如果按照评分的话大概可以总结为
cin<cinios≈scanf<my≈zyh<hzwer<fread