关于快读和cin优化
  • 板块学术版
  • 楼主AzzyZhe
  • 当前回复14
  • 已保存回复14
  • 发布时间2020/9/18 12:07
  • 上次更新2023/11/5 13:03:45
查看原帖
关于快读和cin优化
274209
AzzyZhe楼主2020/9/18 12:07

只是好奇

昨天同学(@FeliksFun )给我看了一个代码,注释说ios::sync_with_stdio(0)可以让cin比快读还快。于是我写了个代码测了下,结果如注释

#include<stdio.h>
#include<ctype.h>
#include<iostream>
#include<ctime>
using namespace std;
#define QINOUT
#if defined(QINOUT)
 #define isDigit(c) (c>='0'&&c<='9')
 class qios{//onlyint
 	FILE
 		*Finput=stdin,//fopen("c.in","rb");
 		*Foutput=stdout;
   public:
 	//template<>qios &operator>>();
 	template<typename Tp_i>inline
 	bool operator>>(Tp_i &num)
 	{
 		static char c;
 		do{
 			if(!fread(&c,1,1,Finput))
 				return 0;
 		}while(c!='-'&&!isdigit(c));
 		num=0;
 		bool flag=0;
 		if(c=='-')
 		{
 			flag=1;
 			fread(&c,1,1,Finput);
 		}
 		while(isdigit(c))
 		{
 			num<<=1;num+=num<<2;//num*=10;
 			num+=c-'0';
 			if(!fread(&c,1,1,Finput))
 				break;
 		}
 		if(flag)
 			num*=-1;//num=(~num)+1 ?
 		return 1;
 	}
 	/*template<double>inline
 	qios &operator>>(double &num)
 	{
 		scanf("%lf",&num);
 		return *this;
 	}*/
 	template<typename Tp_i>inline
 	qios &operator<<(Tp_i num)//emmm
 	{
 		//cout<<num;return *this;
 		if(num==0)
 		{
 			fwrite("0",1,1,Foutput);
 			return *this;
 		}
 		if(num<0)
 		{
 			fwrite("-",1,1,Foutput);
 			num*=-1;
 		}
 		static char stk[32];//uint64 len18(10)
 		char *ps=stk;
 		while(num)
 		{
 			*(ps++)='0'+(num%10);
 			num/=10;
 		}
 		while(ps-->stk)
 			fwrite(ps,1,1,Foutput);
 		return *this;
 	}
 }qio;
 //#undef isDigit
 //#define cin qio
 //#define cout qio
#endif
template<typename Tp_i>inline
void read2(Tp_i &num)//no eof
{
	static char c;
	do{
		c=getchar();
	}while(c!='-'&&!isDigit(c));
	num=0;
	bool flag=0;
	if(c=='-')
	{
		flag=1;
		c=getchar();
	}
	while(isDigit(c))//isdigit(c)
	{
		num<<=1;num+=num<<2;//num*=10;
		num+=c-'0';
		c=getchar();//
	}
	if(flag)
		num=(~num)+1;
}
//#define isDigit isdigit
template<typename Tp_i>inline
Tp_i read()//no eof
{
	Tp_i num=0;
	static char c;
	do{
		c=getchar();
	}while(c!='-'&&!isDigit(c));
	bool flag=0;
	if(c=='-')
	{
		flag=1;
		c=getchar();
	}
	while(isDigit(c))//isdigit(c)
	{
		num<<=1;num+=num<<2;//num*=10;
		num+=c-'0';
		c=getchar();//
	}
	if(flag)
		num*=-1;//num=(~num)+1 ?
	return num;
}
int main()
{
	int a=0;
	ios::sync_with_stdio(0);
	clock_t t0=clock();
	//while(scanf("%d",&a)!=EOF);			   //2.13s~2.15s
	while(cin>>a);							//22.06s~22.10s / 同步22.07s~22.30s
	//while(qio>>a);							//2.01s~2.05s
	//for(int i=0;i!=0xfffff;i++)read2(a);	  //1.66s~1.68s
	//for(int i=0;i!=0xfffff;i++)a=read<int>(); //1.56s~1.58s
	clock_t t=clock()-t0;
	cout<<double(t)/CLOCKS_PER_SEC<<'s'<<' '<<t<<endl;
	qio<<a;
	return 0;
}
//<sort.cmp1.in (0xffff  in short)
//<0xfffff.in   (0xfffff in int  )
//53%省电模式
//52%非省电模式
//scanf 1.95s
//cin   20.49s/同步20.38s //????
//qio   1.85s
//read2 1.52s
//read  1.44s /1.50s when use ctype.h::isdigit

运行环境是Linux虚拟机(平板Cxxdroid软件),读入为shell<重定向,0xfffff.in里面有由rand()-0xfffffff(emmm知道了这个范围有点问题不在int,但换long long a和read()以后结果仍然差不多)生成的0xfffff个整数,以空格分隔、结束。

可以看到cin慢得出奇,并且有没有同步差不多??是我的姿势不对吗?

2020/9/18 12:07
加载中...