打印

kei5 怎么优化,可以使代码运行最快效率最高

[复制链接]
2300|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hclwj181|  楼主 | 2018-8-31 14:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   
     最近做个项目使用到优化的时候,一直有一些疑问:
1,使用的是STM32F1,刚开始的时候使用O1级别优化,调试完成之后,改成了O2,做斜率的时候,明显感觉到了程序速度提升近2倍。而且其它的感觉也比以前块,以eeprom为例,本来O1的时候完全没问题,改成O2 后,就只能读不能写,找了半天才发现时序变了。
2,C++ Code Generation 里面那么多选项,那些选项除了常用几个,其他具体都是做什么用的,感觉搞得不
   是很明白,希望高手解答??
3,怎么样选择能使程序跑的最快,怎么样选择能使代码量最小了,感觉搞得也不是特别明白
说明:我程序在选择O1优化时候为81k左右,选择O2时降低到了73K左右,选择O3时候跟O1差不多,但是速度方面,O2和O3差的不多,跟O1都有明显提升

相关帖子

沙发
iDiy| | 2018-8-31 14:51 | 只看该作者
1、空间优化
2、时间优化
3、1和2折中

使用特权

评论回复
板凳
hclwj181|  楼主 | 2018-8-31 17:12 | 只看该作者
本帖最后由 hclwj181 于 2018-8-31 17:22 编辑
iDiy 发表于 2018-8-31 14:51
1、空间优化
2、时间优化
3、1和2折中

感觉O2程序量最小, 不知道选择哪个最快,试了下除了O0感觉都差不多,代码量O2明显最小

使用特权

评论回复
地板
iDiy| | 2018-8-31 17:49 | 只看该作者
本帖最后由 iDiy 于 2018-9-1 11:46 编辑
hclwj181 发表于 2018-8-31 17:12
感觉O2程序量最小, 不知道选择哪个最快,试了下除了O0感觉都差不多,代码量O2明显最小 ...

Arm® Compiler performs several optimizations to reduce the code size and improve the performance of your application. However, optimization techniques can result in the loss of debug information, increased build time, or increase in image size. Optimization levels are always a trade-off between these three parameters.

Arm Compiler provides optimization options for the different optimization trade-offs. Primarily, you can optimize for performance or for image size. However, there are several options for finer control of the optimizations techniques. The optimization options are:

-O0
This is the default optimization setting. It turns off most optimizations, and gives the best correlation between the built image and your application source code.
Use the following options to optimize performance:

-O1
This results in more optimizations for performance, when compared to -O0. It also reduces the information available for debugging, and might result in an increased image size. Arm recommends this option for debugging.
-O2
This results in more optimizations for performance, when compared to -O1. It also reduces the information available for debugging, and might result in an increased image size.
-O3
This results in more optimizations for performance, when compared to -O2. It also reduces the information available for debugging, and might result in an increased image size.
-Ofast
This results in more optimizations for performance, when compared to -O3. It also reduces the information available for debugging, and might result in an increased image size. At this optimization level, Arm Compiler might violate certain language standards.
-Omax
This results in more optimizations for performance, when compared to -Ofast. It also reduces the information available for debugging, and might result in an increased image size. At this optimization level, Arm Compiler might violate certain language standards. Arm recommends this option for best performance.
Use the following options to optimize for size:

-Os
This results in reduced code size, and also reduces the information available for debugging. Using this option might make your code slower.
-Oz
This results in more reduced image size, when compared to -Os, and also reduces the information available for debugging. Using this option is likely to make your code slower than -Os. Arm recommends this option for best code size.

使用特权

评论回复
5
hclwj181|  楼主 | 2018-9-1 11:35 | 只看该作者
iDiy 发表于 2018-8-31 17:49
Arm® Compiler performs several optimizations to reduce the code size and improve the performance  ...

怎么感觉实际的跟这个说明有点不一样了,O2级别优化,明显代码量最小,论代码量O2<O1<O3<O0,我亲测。至于下面的几个优化,keil里面没看到啊

使用特权

评论回复
6
jekey| | 2018-9-1 12:29 | 只看该作者
换IAR,选最高优化级别,代码应该比keil mdk小。

使用特权

评论回复
7
hclwj181|  楼主 | 2018-9-1 14:30 | 只看该作者
jekey 发表于 2018-9-1 12:29
换IAR,选最高优化级别,代码应该比keil mdk小。

keil用习惯了,我现在的flash和RAM足够大,就是想尽可能提升速度,在优化那里搞得不是很明白,所以来论坛和大家讨论下

使用特权

评论回复
8
tianxj01| | 2018-9-1 14:32 | 只看该作者
从代码压缩结果来看,用IAR在代码运行效率、大小、功能完整性来说,个人知道的无疑是最好的。
只需要注意哪些容易被优化掉的for 空循环延时程序,其他的一般很少因为代码优化出程序功能性问题。

使用特权

评论回复
9
qinlu123| | 2018-9-3 13:12 | 只看该作者
别用编译器优化会出问题的

使用特权

评论回复
10
wozaihuayu| | 2018-9-5 08:24 | 只看该作者
IAR 吧

使用特权

评论回复
11
ningling_21| | 2018-9-5 08:38 | 只看该作者
运行快慢,效率高低,跟系统时钟和如何写代码有一定关系

使用特权

评论回复
12
hyh403| | 2018-9-6 09:29 | 只看该作者
   在写代码,先写好框架,尽量模块化,比这个软件优化强多了。

使用特权

评论回复
13
hclwj181|  楼主 | 2018-9-13 08:54 | 只看该作者
tianxj01 发表于 2018-9-1 14:32
从代码压缩结果来看,用IAR在代码运行效率、大小、功能完整性来说,个人知道的无疑是最好的。
只需要注意哪 ...

如果iic和spi用模拟的还是对时序有影响的,由于速度变快,可能导致时序不对

使用特权

评论回复
14
tianxj01| | 2018-9-13 09:00 | 只看该作者
hclwj181 发表于 2018-9-13 08:54
如果iic和spi用模拟的还是对时序有影响的,由于速度变快,可能导致时序不对 ...

是的,所以,这里短延时,比如空操作,我不会用C认可的空操作指令,而是插入汇编代码来做,系统优化一般不会将汇编代码优化掉的,反正我是没发现。

使用特权

评论回复
15
ayb_ice| | 2018-9-14 11:19 | 只看该作者
延时代码要不受优化影响,比如使用定时器

使用特权

评论回复
16
khgcxz| | 2018-9-21 09:42 | 只看该作者
谢谢楼主们的分享

使用特权

评论回复
17
hclwj181|  楼主 | 2018-10-9 08:52 | 只看该作者
最近又发现了个奇怪的问题,就是在赋值的时候,浮点型float a = b;  其中如果b>=10000,选择优化,直接把赋值语句跳了过去,如果b<=9999则正常。如果选择O-0优化,则也是正常运行。为什么会这样了,百思不得其解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

720

帖子

9

粉丝