打印

为什么宏的执行比函数还慢?

[复制链接]
1723|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TuBie|  楼主 | 2011-1-3 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 TuBie 于 2011-1-3 17:07 编辑

用STM32F103RET6,编译器是keil,写了一个宏定义和一个函数,实现同样的功能,即在PA.0上发一个脉冲,定义分别为:

宏定义:
#define PULSE1(){GPIOA->BSRR=0x01;GPIOA->BRR=0x01;}

函数定义:
void debug_pulse(void)
{
GPIOA->BSRR=0x01;
GPIOA->BRR=0x01;
}


结果执行
while(1)
{
    PULSE1();
}
其周期为210ns。

而执行
while(1)
{
    debug_pulse();
}
其周期为93ns。

以上测试是用示波器直接看PA.0引脚得到的,不理解为什么函数执行的比宏还要快。
沙发
winloop| | 2011-1-3 17:58 | 只看该作者
太可怕了,严重关注,我在项目中也用宏定义嵌入到代码中,为了节省点儿运行时间

使用特权

评论回复
板凳
香水城| | 2011-1-3 18:17 | 只看该作者
看看对应的汇编指令

使用特权

评论回复
地板
winloop| | 2011-1-3 18:52 | 只看该作者

就应该是直接替换的,难道编译器还会拐个小弯实现?

使用特权

评论回复
5
TuBie|  楼主 | 2011-1-3 21:08 | 只看该作者
本帖最后由 TuBie 于 2011-1-3 21:09 编辑

可能是编译优化的原因,做了一下实验,结果如下:

无优化
宏:125ns
函数:330ns


level 3 级别的运行速度优化:
宏:208ns
函数:97ns


先前做的是优化后的结果。

使用特权

评论回复
6
Simon21ic| | 2011-1-4 02:22 | 只看该作者
用IAR试试,这个有奇怪,keil连这个也优化不了?

使用特权

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

本版积分规则

135

主题

428

帖子

0

粉丝