技巧1:编译优化

 

    1.使用inline

    inline函数只是对编译器的一个建议,最后是不是真正成为内联函数,还是要看Compiler。

    inline的使用是有所限制的,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是递归函数

 

    2.使用rigister

    register关键字只是对编译器的一个建议,最后是不是真正存放在寄存器内,还是要看Compiler。

    使用register修饰的变量不能占太大的内存空间,或者不能使用太多register变量

    使用register修饰的变量不能用&取地址(没有内存地址)

    使用register修饰的变量不能为全局变量

    建议在循环变量和快速读入(又叫读入优化)的时候使用

 

技巧2:调用优化

 

    1.不传参

    明了简单。多用全局变量少传参。

    在STL Sort+自定义bool cmp()函数的双关键字升序排序和手写双关键字升序排序中,传参比较少的手写函数在200000数据的时候可以快0.07~0.1s,相当于跑四五次sort的时间了。(对此结果有疑问的,留下邮箱,发送测试文件夹)

 

    2.void类型的函数不写return

    玄学吧这个大概是(为什么好说倒装句山东人???)

 

    3.如果某变量只在一个函数中用到,尽量开成局部变量

    玄学。

 

技巧3:执行优化

 

    1.手写 不用STL

    不解释了吧。有些时候STL很慢,相见lrj紫书

 

    2.

bool flag=true;
if (flag) do_something();
//比
if (flag==true) do_something();
//要快
//
//还有,
flag=false;
if (!flag) do_something();
//比
if (flag==false) do_something();
//要快

 

    3.使用Fill (#include<iterator>)和 memset (#include<cstring>)

 

    这两个东西比for赋值要快。

 

    4.循环展开

for (int i=1;i<=5;i++) do_something();


for (int i=1;i<=5;i+=4)
{
	if (5-i>=4)
	{
		do_something();
		do_something();
		do_something();
		do_something();
	}
	else
	{
		for (int j=i;j<=5;j++) do_something();
		break;
	}
}

 

    5.a[0]=a[1]=1;比a[0]=1; a[1]=1;快?

 

    玄学吧……应该没多大效果

 

    6.读入优化

inline void readx(int &x)
{
	x=0;
	register char ch=0;
	while (ch<'0' || ch>'9') ch=getchar();
	while (ch>='0' && ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
}

这个没负数,自己加吧。

 

 

    7.运算优化

    double除法比int除法快

    bool运算比算术运算快

    减法比加法乘法快

    尽量快速幂

 

    8.可能的话,空间换时间

 

    9.不是很确定的方法

    &比return快???

分类: 其他技巧

1 条评论

Wider · 2017年8月15日 21:49

6666%dalao

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.