高级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的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

您好,我想跟你请教一下关于C语言学习方法的问题。

关于c语音,二进制问题?

性能调优 -- 语言篇(C)

Java 中许多 if-else 语句的性能不佳

关于T-SQL的多重IF-ELSE嵌套

2021高级Java笔试总结,统统都会!