常用常数优化集合

以下是常用的常数优化指令,代码的集合。

常数优化就算加四十八行也跑不过算法的低效率,本质上还是要靠算法的优化和剪枝。仍不完善,等待补充。

不过被卡常数的感觉真是好难受啊……

1.sync针对cin和cout的输入输出加速。

各位平时在用的时候绝对感觉到了,iostream的流输入输出操作符比stdio慢的不是一点半点,有时候甚至能算法正确,就是因为用了流输入输出硬是给卡成TLE。这种现象是由于iostream为了保证安全性有一个缓冲区,数据会先输入到缓冲区里再填进变量或者输出到stdout里,通过使用这一指令能够关闭iostream和stdio的同步,对于输入输出的优化大约在2~3倍。

ios::sync_with_stdio(false);

2.编译器自带的Optmize

这个应当是无人不知无人不晓,在代码开头加上一句O3优化时间直接减少一倍的并不在少数。(据说O2和O3交替着一直叠效果更好,竞赛禁用)

#pragma GCC optimize(3,"Ofast","inline")//O3优化
#pragma GCC optimize(2)//O2优化

网传四十行极限加速,有时候很猛,有时候则毛用没有。

#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")

针对max和min的优化

该死的max和min函数,一旦要比较的两个变量数据类型不一样,就算是long long和int都会报错,而且还极其之慢,是STL的标准尿性。但是,利用三目运算符不仅能加快速度,还能解决不同数据类型间无法比较的问题。

#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)

Register对重复调用变量的优化

像是循环里的i和j,在一个程序中会被调用许多次,从硬件层面,如果每一层循环都使用新定义的临时变量,从内储存器中吸变量的值将会产生无谓的消耗,在使用变量时在变量名前面加上register这个修饰符能够在可能的情况下将这个变量放在寄存器里减少调用消耗。

int i,j,n=input;
for(register i=1;i<=n;i++)
    for(register j=1;j<=n;j++)
        do something;

Inline对调用函数的优化

如果在主函数中调用一个函数,执行方式是跳转到调用函数的开始地址,运行到结尾地址后跳转回原处。这种调用开销在多次调用时就会显得很大,特别是针对那些函数体简单调用次数的函数。所以像define宏一样,inline将函数体的代码直接贴到主函数的调用位置减少开销。如果函数体本身很膨胀或者存在其他复杂度较高的操作,这样的优化可能是无用或者可能会被编译器忽略的。

int tmp;
inline int reply(int a,int b){
    register tmp=a;
    a=b;
    b=tmp;
}

写着写着忽然发现一个神佬的博客,里头快读快写和上面的东西要有全都有,位运算减少时间复杂度的都有,也许这就是省选级别的OIER的基本操作吧……

链接Paste:CNBlog

I'm Schwarzkopf Henkal.

posted @ 2019-10-18 16:23  Schwarzkopf_Henkal  阅读(429)  评论(0编辑  收藏  举报