探寻C++读入时间效率

转C后听得最多的就是C++字符串恼火啊,确实。。。。。


然后就是看到JN转C后不习惯printf和scanf,就用cin和cout

风险太大了。。。。

他们都说Pascal读入很快,所以今天就测试了一下

现在比较一下所有读入时间效率


现在是题目

先读入n,再读入n个整数,输出n
data0~3 n=10000
data4~9 n=5000000
每个整数≤0x3f3f3f3f(1061109567)


评测环境(学校机子,就这样了。。。)

Intel(R) Core(TM) 2 Duo CPU E7200 @2.53GHz

2.53GHz, 0.99GB的内存



用的最多的就是scanf

#include<cstdio>

int main()
{
	freopen("read.in","r",stdin);
	freopen("read.out","w",stdout);
	int a;int n;
	scanf("%d",&n);printf("%d\n",n);
	while(n--) scanf("%d",&a);
	return 0;
}



其次我们再来看看cin

#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
	freopen("read.in","r",stdin);
	freopen("read.out","w",stdout);
	int a;int n;
	cin>>n;printf("%d\n",n);//为了排除cout和printf的差别
	while(n--) cin>>a;
	return 0;
}



还有取消了同步的cin

#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
	std::ios::sync_with_stdio(false);
	freopen("read.in","r",stdin);
	freopen("read.out","w",stdout);
	int a;int n;
	cin>>n;printf("%d\n",n);
	while(n--) cin>>a;
	return 0;
}




在看看pascal的read

var n,a,i:longint;
begin
  assign(input,'read.in');
  assign(output,'read.out');
  reset(input);rewrite(output);
  read(n);writeln(n);
  for i:=1 to n do read(a); 
  close(input);close(output);
end.




C++有个东东交读入优化,就是一个字符一个字符地读入

#include<cstdio>
#include<cctype>

int getint()
{
	int res=0,sign=0;char tmp;
	do tmp=getchar();
	while(!isdigit(tmp)&&tmp!='-');
	if(tmp=='-') {tmp=getchar();sign=1;}
	do res=(res<<3)+(res<<1)+tmp-'0';
	while(isdigit(tmp=getchar()));
	return sign?-res:res;
}

int main()
{
	freopen("read.in","r",stdin);
	freopen("read.out","w",stdout);
	int a;int n=getint();printf("%d\n",n);
	while(n--) a=getint();
	return 0;
}



当然,既然可以一个一个的读,就还可以整体读入再处理

#include<cstdio>
#include<cstring>
#include<cctype>
int MAXL=5000000*50-100;
char s[5000000*50];
int pos,len;

int getint(char *s)
{
	int res=0,sign=0,tmp;
	do tmp=s[pos++];
	while(!isdigit(tmp)&&tmp!='-');
	if(tmp=='-') {tmp=s[pos++];sign=1;}
	do res=(res<<3)+(res<<1)+tmp-'0';
	while(isdigit(tmp=s[pos++]));
	return  sign?-res:res;
}

int main()
{
	freopen("read.in","r",stdin);
	freopen("read.out","w",stdout);
	memset(s,0,sizeof(s));fgets(s,MAXL,stdin);
	pos=0;len=strlen(s);
	int n=getint(s);printf("%d\n",n);
	memset(s,0,sizeof(s));fgets(s,MAXL,stdin);
	int a;
	pos=0;len=strlen(s);
	while(n--) a=getint(s);
	return 0;
}



最后再看看排名


最让我意外地就是 pascal 的时间居然比 scanf 慢!所以说C++的 scanf 读入绝对不慢于pascal的 read !


然后就是cin,时间简直是一个天文数字!


getchar最快


fgets虽然也快,但是空间很大

不过也是有原因的,因为这一题我们不需要把值存下来,所以就没开数组,仅仅用一个变量,但是fgets却需要一个数组来存

如果需要把数存下来的话fgets也是可以选择的


不过与其写fgets不如写getchar,因为fgets处理成int的过程就和getchar 很相像!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值