高级C语言关于if-else的性能问题
Posted 从善若水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级C语言关于if-else的性能问题相关的知识,希望对你有一定的参考价值。
本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。
博客内容主要围绕:
5G/6G协议讲解
算力网络讲解(云计算,边缘计算,端计算)
高级C语言讲解
Rust语言讲解
文章目录
关于if-else的性能问题【无else】
我们这里不考虑 CPU的分支预测和投机行为,单纯分析 if-else 的性能问题
先来看一下测试程序以及测试数据,
#include <stdio.h>
int main()
int b=-1; //b=1;
int a=0;
for(unsigned long i=0;i<7000000;++i)
if(b<0) a++;
return 0;
程序很简单,就是执行 7000000次的 if 语句。
测试条件 | 测试结果 |
---|---|
b=-1 | |
b=1 |
上面的结果可以看到,if 条件不满足的时候执行时间比if条件满足的时间要长。其实这个很容易理解,与加法运算比起来,跳转指令的执行时间肯定要长。
对应的汇编代码如下👇,
优化方法
主要是对 if 中的条件要有一个主观的判断。以上面的代码为例,根据经验或者统计数据,我知道 b<0 的概率大,那么我就可以写成 if(b<0) … 的形式,反之亦然。说白了就是考虑如何减少跳转指令的执行次数。
在GCC中有这样一个函数 __builtin_expect(),你可以使用__builtin_expect 向编译器提供分支预测信息。
第二种方法,对于简单的 if 语句想办法将其优化为一条非 if 语句,例如上面例子中的,
......
if(b<0) a++;
......
可以优化为,
#include <stdio.h>
int main()
int b=-1,a=0;
for(unsigned long i=0;i<7000000;++i)
a-=b>>(sizeof(b)*8-1);
return 0;
测试数据如下:
测试条件 | 测试结果 |
---|---|
b=-1 | |
b=1 |
解释一下,我们这里将 b>>(sizeof(b)*8-1) 其实就是只保留了 b 的符号位,如果b是正数则移位之后变为0;如果是负数,移位之后变成 -1。
关于if-else的性能问题【有else】
测试代码如下,
#include <stdio.h>
int main()
int b=-1; //b=1;
int a=0;
for(unsigned long i=0;i<7000000;++i)
if(b<0) a++;
else a--;
return 0;
执行时间消耗如下表:
测试条件 | 测试结果 |
---|---|
b=-1 | |
b=1 |
测试数据显示时间消耗基本是一样的。这很好理解,不管if-else 执行哪个分支,最后都会发送跳转并执行一条语句,所以时间消耗基本一样。
这里是从善若水的博客,感谢您的阅读📕📕📕
以上是关于高级C语言关于if-else的性能问题的主要内容,如果未能解决你的问题,请参考以下文章