处理器Intel 酷睿i5 6300U
1.cin
测试对象:1000W个int类型数
#include <bits/stdc++.h> int main(){ freopen("num.txt","r",stdin); int a; for(int i=1;i<=10000000;i++) std::cin>>a; return 0; }
跑了 5.8s , 活脱脱的变慢了
测试测试对象:1MB的字符。
#include <bits/stdc++.h> int main(){ freopen("string.txt","r",stdin); char a; for(int i=1;i<=10000000;i++) std::cin>>a; return 0; }
用char读用时1.2s。
#include <bits/stdc++.h> int main(){ freopen("string.txt","r",stdin); std::string st; std::cin>>st; return 0; }
用string读用时3.6s。。。。。
改变对象为20MB时,cin读 char 和string分别耗时7.65s和23.81s
2.std::ios::sync_with_stdio(false) 取消cin与stdin同步之后
#include <bits/stdc++.h> using namespace std; int main(){ freopen("string.txt","r",stdin); sync_with_stdio(false); char a; for(int i=1;i<=50000000;i++) cin>>a; return 0; }
同样20MB的用时1.585s,快好多啊!
3.scanf
#include <bits/stdc++.h> using namespace std; int main(){ freopen("num.txt","r",stdin); int a; for(int i=1;i<=10000000;i++) scanf("%d",&a); return 0; }
1000W个数用时4.9s比cin快,但优势不太明显。
20MB的字符读入用时3.525s,比cin快太多了,但还是有可以提升的空间。
4.getchar
getchar 是 c++里面较快的读入了。
#include <bits/stdc++.h> using namespace std; int read(){ int x=0; char ch=getchar(); while (ch<‘0‘ || ch>‘9‘) ch=getchar(); while (ch>=‘0‘ && ch<=‘9‘){ x=x*10+ch-‘0‘; ch=getchar(); } return x; } int main(){ freopen("num.txt","r",stdin); int a; for(int i=1;i<=10000000;i++) a=read(); return 0; }
读1000W个数字用时0.65s,比cin/scanf快很多有没有!
读20MB的字符也只要0.288s,好快!
5.fread
将文件全部读入到一个字符串里
#include <bits/stdc++.h> const int MAXS = 60*1024*1024; int numbers[10001000]; char buf[MAXS]; void read(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‘; } int main(){ freopen("num.txt","rb",stdin); int len = fread(buf,1,MAXS,stdin); buf[len] = ‘/0‘; read(buf,len); }
0.45s竟然比getchar还慢。。。
总结试一下,再某些读入超大的题目中,果然还是getchar好用啊。至少要保证算法复杂度能过的情况下不被卡输入。。。好像有的程序,卡卡读入问题就能过了。。。。
时间: 2024-10-13 22:13:46