code
#include <cstdio>
#include <cctype>
char buff[65536], *HEAD = buff, *TAIL = buff;
#define getc() (HEAD == TAIL && (TAIL = (HEAD = buff) + fread(buff, 1, 65536, stdin), HEAD == TAIL) ? 0 : *HEAD++)
char obuf[65536], *OHEAD = obuf, *OTAIL = obuf + 65536;
#define putc(x) (OHEAD == OTAIL && (OHEAD = obuf, fwrite(obuf, 1, 65536, stdout)), *OHEAD++ = x)
#define endo() (fwrite(obuf, 1, OHEAD - obuf, stdout))
template <class T>
bool read(T &ret)
{
char ch;
bool flag = false;
for (ch = getc(); !isdigit(ch); ch = getc())
if (ch == 0)
return false;
else if (ch == '-')
flag = true;
for (ret = ch ^ 48; isdigit(ch = getc()); ret = (ret << 3) + (ret << 1) + (ch ^ 48))
;
if (flag)
ret = -ret;
return true;
}
template <class T>
T get()
{
T ret;
char ch;
for (ch = getc(); !isdigit(ch); ch = getc())
;
for (ret = ch ^ 48; isdigit(ch = getc()); ret = (ret << 3) + (ret << 1) + (ch ^ 48))
;
return ret;
}
template <class T>
void fget(T &ret)
{
char ch;
for (ch = getc(); ch < 48; ch = getc())
;
for (ret = ch ^ 48; ch = getc(), ch > 47; ret = (ret << 3) + (ret << 1) + (ch ^ 48))
;
}
template <class T>
void write(T x, char end = ' ')
{
static int osta[32];
if (x == 0)
putc('0');
else
{
int top = 0;
if (x < 0)
putc('-'), x = -x;
for (; x; x /= 10)
osta[++top] = x % 10;
for (; top;)
putc(osta[top--] ^ 48);
}
putc(end);
}
测试输出 (1亿数据)
#include <ctime>
#include <cassert>
void testwrite(int num)
{
freopen("input.txt", "wb", stdout);
for (int i = 0; i < num; ++i)
write(i);
endo();
}
int main()
{
double t=clock();
testwrite(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出
5.075s
测试输入1 (1亿数据)
#include <ctime>
#include <cassert>
void testread(int num)
{
freopen("input.txt", "rb", stdin);
int n;
for (int i = 0; i < num; ++i)
{
assert(read(n));
assert(n==i);
}
}
int main()
{
double t=clock();
testread(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出
3.199s
测试输入2 (1亿数据)
void testget(int num)
{
freopen("input.txt", "rb", stdin);
int n;
for (int i = 0; i < num; ++i)
{
n=get<int>();
assert(n==i);
}
}
int main()
{
double t=clock();
testget(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出
2.829s
测试输入3 (1亿数据)
void testfget(int num)
{
freopen("input.txt", "rb", stdin);
int n;
for (int i = 0; i < num; ++i)
{
fget(n);
assert(n==i);
}
}
int main()
{
double t=clock();
testfget(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出(woc,竟然比2慢)
2.947s
测试输入4 (根据3,修改get,1亿数据)
template <class T>
T get()
{
T ret;
char ch;
for (ch = getc(); ch<48; ch = getc())
;
for (ret = ch ^ 48; ch = getc(),ch>47; ret = (ret << 3) + (ret << 1) + (ch ^ 48))
;
return ret;
}
void testget(int num)
{
freopen("input.txt", "rb", stdin);
int n;
for (int i = 0; i < num; ++i)
{
n=get<int>();
assert(n==i);
}
}
int main()
{
double t=clock();
testget(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出
2.541s
缓慢的scanf(1亿数据)
void testscanf(int num)
{
freopen("input.txt", "rb", stdin);
int n;
for (int i = 0; i < num; ++i)
{
scanf("%d",&n);
assert(n==i);
}
}
int main()
{
double t=clock();
testscanf(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出
145.710s
最后测试cin(1亿数据)
#include<iostream>
using namespace std;
void testcin(int num)
{
freopen("input.txt", "rb", stdin);
int n;
for (int i = 0; i < num; ++i)
{
cin>>n;
assert(n==i);
}
}
int main()
{
double t=clock();
testcin(100000000);
fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
输出(考验耐心,巨慢)还是关闭与scanf的同步吧
323.904s