C++ 优化:for循环展开

我写了一段代码:

#include <cstddef>
const size_t array_length = 1024*1024*256;

int main()
{
    auto arr = new char[array_length];

#ifdef NO_EXPEND
for(size_t i = 0; i<array_length; i ++){
        arr[i] = 0;
    }

    for(size_t i = 0; i<array_length; i ++){
        arr[i] = arr[i] + 1;
    }
#else
    for(size_t i = 0; i<array_length; i = i+8){
        arr[i] = 0;
        arr[i + 1] = 0;
        arr[i + 2] = 0;
        arr[i + 3] = 0;
        arr[i + 4] = 0;
        arr[i + 5] = 0;
        arr[i + 6] = 0;
        arr[i + 7] = 0;
    }

    for(size_t i = 0; i<array_length; i = i + 8){
        arr[i] = arr[i] + 1;
        arr[i + 1] = arr[i + 1] + 1;
        arr[i + 2] = arr[i + 2] + 1;
        arr[i + 3] = arr[i + 3] + 1;
        arr[i + 4] = arr[i + 4] + 1;
        arr[i + 5] = arr[i + 5] + 1;
        arr[i + 6] = arr[i + 6] + 1;
        arr[i + 7] = arr[i + 7] + 1;
    }
#endif
    delete [] arr;
    return 0;
}

运行结果如下:


image.png

我们可以看到,在for循环展开可以提高代码的执行效率,主要的原因有以下两点
1、提高缓存命中(cache hit)率
2、减少分支预测,当前例子下,也可以简单的理解为条件判断减少。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 理论总结 它要解决什么样的问题? 数据的访问、存取、计算太慢、太不稳定、太消耗资源,同时,这样的操作存在重复性。因...
    jiangmo阅读 8,025评论 0 11
  • 一、前言 我们知道在Arm Arch32里面有个突发传输指令LDM、STM,也就是说可以一次传输多个值,到底是多少...
    十曰立阅读 11,619评论 0 5
  • 人生如茶,茶只有两种姿态,沉,浮。饮茶人两种姿势,拿起,放下。沉时坦然,浮时淡然。人生不过一杯茶,满也好,...
    张紫暄妈妈阅读 1,079评论 0 0
  • 2017年11月19日 好像没有过渡期,直接从夏季到了冬季。 风,感觉是萧瑟的,有点刺骨。 衣橱里还是薄薄的夏衣,...
    幸运花开随笔阅读 1,059评论 1 0
  • 学的知识多了,才知道自己是多么渺小,况且自己的知识并不多;接触的人多了,才知道自己所谓的努力,与他们一比,真是小...
    是馄饨呀阅读 3,211评论 3 6