您好,欢迎访问这里是您的网站名称官网!
新闻资讯

服务热线400-123-4567

公司新闻

首页 > 新闻资讯 > 公司新闻

什么是o1,o2,o3优化

作者:佚名 发布时间:2024-05-26 10:26:09点击:

为了加快代码执行效率,很多oj平台(online judge是一个在线判题系统,用户可以提交程序源代码,通常支持多种语言,系统对源代码进行编译和执行,并通过预设的数据测试来验证代码的正确性)都用到了o2优化(因为O2优化比O1优化更为强大,而又几乎没有O3优化·所带来的问题,所以被广泛采纳比如洛谷网站的oj平台就采用O2优化)

GCC为了满足不同的编译需求,提供了近百种的优化方案,用来对? 编译时间? ? ?目标文件实现长度? ? 执行效率进行不同程度的取舍和优化,总体上有以下这几类:

  1. 1 精简操作指令;

  2. 2 尽量满足 cpu 的流水操作;

  3. 3 通过对程序行为地猜测,重新调整代码的执行顺序;

  4. 4 充分使用寄存器;

  5. 5 对简单的调用进行展开等等。

o0优化:编译器不做任何优化,是程序编译时的默认选项。

o1优化:对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化。

包括下面的内容:

把变量分配到寄存器。分析循环的会出现的各种情况,只保留一个退出循环的分支。将没有用的代码删掉。简化表达式和声明。将用inline声明的内联函数变为函数调用等等。

O2: 包含O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化,编译器不执行循环展开以及函数内联。这是推荐的优化等级,除非你有特殊的需求。O2会比O1启用多一些标记。与O1比较该优化O2将会花费更多的编译时间当然也会生成性能更好的代码。

O3: 打开所有O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, fgcse-after-reload and -ftree-vectorize优化选项。这是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用O3是不推荐的。


综上来说:O1 O2 O3优化就是用来提高执行效率和减少运行时间的工具,并且O2优化包含O1优化,并在此基础上增加一些新的功能,同理03也是这样。

求赞!求赞!!求赞!!!

相关标签: 优化 编译 执行 代码 时间

平台注册入口