1.IO优化 


fread 和 fwrite ,如果还想再优化有mmap….(然而并不会用,好像也没用。。。) 


读入优化(这个非常重要!!!!!!!)

inline int Read()
{
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    return x*f;
}

当然还有另一种但是这种只适用于读取非负数如下:

inline int read(){
    int num;
    char ch;
    while((ch=getchar())<'0' || ch>'9');
    num=ch-'0';
    while((ch=getchar())>='0' && ch<='9'){
        num=num*10+ch-'0';
    }
    return 0;
}

输出优化:

inline void out(int x){
    if(x>=10){
        out(x/10);
    }
    putchar(x%10+'0');
}

大家注意一下快速读入和快速输出尽量爆int的数据就尽量不要用了我原来用快速输出就WA掉了但是用printf就没有问题 

 

对于一个有10000000个随机数字,大小约为38M的文本文件;

输入测试:

1、用scanf()方式读入需要5.01秒

2、用以下方式读入则只需要1.139秒

#include<iostream>
#include<cstdio>
using namespace std;
void read(int &x){
	x=0;char c=getchar();
	while(c<'0' || c>'9')c=getchar();
	while(c>='0' && c<='9'){
		x=x*10+c-'0';
		c=getchar();
	} 
}
int main(){
	freopen("tt.in","r",stdin);
	int i,j,k,m,n;
	for(i=1;i<=10000000;i++)read(n);
	//for(i=1;i<=10000000;i++)scanf("%d",&n);
	return 0;
}

 

输出测试:

对于上述文件

1、以printf()方式输出需要18.121秒

2、用以下方式输出则需要1.288秒

#include<iostream>
#include<cstdio>
using namespace std;
void read(int &x){
	x=0;char c=getchar();
	while(c<'0' || c>'9')c=getchar();
	while(c>='0' && c<='9'){
		x=x*10+c-'0';
		c=getchar();
	} 
}
void write(int x){
	if(x==0){putchar(48);return;}
	int len=0,dg[20];
	while(x>0){dg[++len]=x%10;x/=10;}
	for(int i=len;i>=1;i--)putchar(dg[i]+48);
}
int main(){
	freopen("tt.in","r",stdin);
	freopen("tt.out","w",stdout);
	int i,j,k,m,n;	
	//for(i=1;i<=10000000;i++){read(n);printf("%d ",n);}
	for(i=1;i<=10000000;i++){read(n);write(n);putchar(' ');}
	return 0;
}


2.inline 


在声明函数之前写上inline修饰符(就像上面Read()一样),可以加快一下函数调用,但只能用于一些操作简单的函数。涉及递

归,大号的循环等很复杂的函数,编译器会自动忽略inline。 


3.register 


在定义变量前写上register修饰符,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量:

register int n,m;

寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中; 
快,不是一般的快,快到什么程度呢?:

register int a=0;
for(register int i=1;i<=999999999;i++)
a++;
int a=0;
for(int i=1;i<=999999999;i++)
a++;

结果: 
优化:0.2826 second 
不优化:1.944 second 
恐怖啊!!!! 


4.循环展开 


循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)… 


5.取模优化(仅O2)

//设模数为 mod
inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+
inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}//代替取模-

6.前置 ++

后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)

7.不要开bool,所有bool改成char,int是最快的(原因不明)。 


8.if()else语句比()?():()语句要慢,逗号运算符比分号运算符要快。