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

[复制链接]
2177|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 | 显示全部楼层

就应该是直接替换的,难道编译器还会拐个小弯实现?
 楼主| TuBie 发表于 2011-1-3 21:08 | 显示全部楼层
本帖最后由 TuBie 于 2011-1-3 21:09 编辑

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

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


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


先前做的是优化后的结果。
Simon21ic 发表于 2011-1-4 02:22 | 显示全部楼层
用IAR试试,这个有奇怪,keil连这个也优化不了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

428

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部