只是好奇
昨天同学(@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慢得出奇,并且有没有同步差不多??是我的姿势不对吗?