密集循环及循环展开的优化

当处理密集循环时,可以加速循环展开和减少循环条件判断的开销,如下:

  • 例子使用IDE写的,举个例子而已。
  • 条件判断是有开销的,条件判断次数越多,开销越大。
  • 该写法最开始由Tom Duff在1983年发明的,最初是用于优化图形处理
#include <QCoreApplication>
#include <QDebug>

static int do_something();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int count = 97;

    //循环展开,减少循环条件的判断次数来减少循环中的指令数量,也减少判断时间;
    int result_t_i = 0;
    int realWhileTimes_t_i = (count + 7 ) >> 3;
    //当case为连续时,编译器会使用表结构优化,例如:gcc -O3
    switch (count & 0x0111u) {
        case 0: do { result_t_i += do_something(); [[gnu::fallthrough]];
        case 7:      result_t_i += do_something(); [[gnu::fallthrough]]; //c14c11
        case 6:      result_t_i += do_something(); [[fallthrough]]; //c17
        case 5:      result_t_i += do_something(); [[fallthrough]];
        case 4:      result_t_i += do_something(); [[fallthrough]];
        case 3:      result_t_i += do_something(); [[fallthrough]];
        case 2:      result_t_i += do_something(); [[fallthrough]];
        case 1:      result_t_i += do_something(); } while(--realWhileTimes_t_i > 0);
    }

    qDebug() << "whileTimes_T:" << realWhileTimes_t_i << " result_t_i:" << result_t_i;

    return a.exec();
}

static int __attribute__((pure)) __attribute__((always_inline)) do_something(void) {
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Taiga_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值