今天给大家讲集中可以优化程序时间的东西
1.O2优化
O2优化是一种手动优化程序时间的东西,但是请注意,在考试中千万不能使用,否则会
c
e
ce
ce。
#pragma once
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#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")
2.快读快写
我们知道,在
c
c
c++中有两种操作,一种是输入,一种是输出。 我们在
c
c
c++中一般用
c
i
n
cin
cin
c
o
u
t
cout
cout 或
s
c
a
n
f
scanf
scanf
p
r
i
n
t
f
printf
printf 来输入输出。 但是在一些有大量输入输出的时候,上面的两种输入输出都太慢了。 那么接下来,就给大家讲一种更快的输入输出。 他们就是快读快写。
快读快写的原理就是在
c
c
c++中,单个字符串的读写比数字的读写要快,所以我们就将一个数字拆成单个单个的自符来读写。
快读模版:
int read()
{
bll s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*f;
}
快写模版:
void write(bll x)
{
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
3.内联函数
本人懒得讲内联函数,所以给你们别人的博客网址,自己去学。 内联函数详解
4.其他优化
(1):正确选择编译器 请大家注意,有些时候,编译器的选择同样会改变代码运行的时间。 比如说各大运行速度中,
c
(
c
l
a
n
g
)
>
c
>
c
+
+
11
c
l
a
n
g
>
c
+
+
(
n
o
i
)
>
c
+
+
11
>
c
+
+
c(clang)>c>c++11clang>c++(noi)>c++11>c++
c(clang)>c>c++11clang>c++(noi)>c++11>c++。
(2):
c
i
n
cin
cin
c
o
u
t
cout
cout优化
1
1
1
std::ios::sync_with_stdio()
C++为了兼容C语言,保证在代码中同时出现std::cout/std::cin和printf/scanf方法时不发生混乱,所以C++使用了一个缓冲区来同步C的标准IO流,通过使用std::ios::sync_with_stdio(false)来解除这种同步,使得cout和cin不再经过缓冲区,进而节省了部分时间。 但是要注意:解除了同步之后,不能再使用C的库函数(scanf,getchar,gets,fgets,fscanf之类)
2
2
2
std::cin.tie
因为std :: cin默认是与std :: cout绑定的,所以每次操作的时候(也就是调用”<<”或者”>>”)都要刷新(调用flush),这样增加了IO的负担,通过tie(nullptr)来解除std :: cin和std :: cout之间的绑定,来降低IO的负担使效率提升。
(3) 把所有变量都设为全局变量,不要设为局部变量。 因为定义全局变量比局部变量更节省时间。
以上就是本蒟蒻给大家讲的几种时间优化方法,希望大家有所收获。
|