首页 > 代码库 > c++ 读入的测试

c++ 读入的测试

处理器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;
} 
View Code

跑了 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;
} 
View Code

用char读用时1.2s。

技术分享
#include <bits/stdc++.h>
int main(){
    freopen("string.txt","r",stdin);
    std::string st;
    std::cin>>st; 
    return 0;
} 
View Code

用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;
} 
View Code

 

同样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;
} 
View Code

 

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;
} 
View Code

读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);
} 
View Code

0.45s竟然比getchar还慢。。。

 

总结试一下,再某些读入超大的题目中,果然还是getchar好用啊。至少要保证算法复杂度能过的情况下不被卡输入。。。好像有的程序,卡卡读入问题就能过了。。。。

 

c++ 读入的测试