2258 字 14 图 : 文章字数

6 分钟 : 预计阅读

网络 : 内容来源

BabyCoder : 编辑整理


前言

  我在《华为 C 语言编程规范》中看到了这个:当使用多重循环时,应该将最忙的循环放在最内层。如下图:

  由上述很简单的伪代码可以看到,推荐使用的方式是:外小内大的方式。也就是内层循环是最忙的。

  然后我又在另外一份编程规范手册中,看到了类似的要求,如下图:

  看到了这个小技巧之后,我迫不及待的分享给我的小伙伴,后来闲下来的时候,就想自己做个测试,验证一下是否真的是这样。

Ubuntu 测试

  使用 Ubuntu 14.04 的系统进行测试,基本信息如下:

  • 系统版本:Ubuntu14.04

  • gcc 版本:4.8.2

  我使用了两份不同的代码文件进行测试,第一份是 外大内小 的代码,如下:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <unistd.h>
using namespace std;
int main(){  struct timeval tv;  unsigned long ulStartTime, ulEndTime;gettimeofday(&tv, NULL);                               // 获取当前时间  ulStartTime = tv.tv_sec * 1000000 + tv.tv_usec;        // 计算当前起始时间  cout << "start time = " << ulStartTime << endl;        // 打印显示  for(unsigned int i = 0; i < 1000000; i++)              // 测试代码  {    for(int j = 0; j < 100; j++)    {          }  }  gettimeofday(&tv, NULL);  ulEndTime = tv.tv_sec * 1000000 + tv.tv_usec;          // 计算结束时间  cout << "end time = " << ulEndTime << endl;            // 打印结束时间  cout << "Time = " << ulEndTime - ulStartTime << endl;  // 计算时间差值 微秒 us}

  执行上述代码,运行结果如下,耗时:165280us

  接着,我又准备了另外一份 外小内大 的代码,对比只是调换了 for 循环内外层的循环次数而已,如下:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <unistd.h>
using namespace std;
int main(){  struct timeval tv;  unsigned long ulStartTime, ulEndTime;gettimeofday(&tv, NULL);  ulStartTime = tv.tv_sec * 1000000 + tv.tv_usec;  cout << "start time = " << ulStartTime << endl;  for(int i = 0; i < 100; i++)  {    for(unsigned int j = 0; j < 1000000; j++)    {}  }  gettimeofday(&tv, NULL);  ulEndTime = tv.tv_sec * 1000000 + tv.tv_usec;  cout << "end time = " << ulEndTime << endl;  cout << "Time = " << ulEndTime - ulStartTime << endl;}

  上述代码的执行结果如下,耗时:155960us

  对比上述两份代码的运行结果,可以很明显的看到,外小内大效率更高一点!

  不过,你以为这就结束了吗?

树莓派测试

  手边刚好有一台树莓派,前段时间刚安装了最新的官方系统,就想着拿来做一下测试,基本信息如下:

  • 树莓派系统版本:buster

  • g++ 版本:8.3.0

  测试代码与在 Ubuntu 上运行的代码保持一致,这里就不重复贴代码了,只看一下运行结果。

  下边这个是 外大内小 的,运行结果如下,耗时:1214569us

  这个是 外小内大 的,运行结果如下,耗时:1345193us

  完了,可以很明显的看到,外大内小 的运行效率要更高一点。

问题分析

  我也是有点蒙逼的,不知道为啥会出现截然相反的情况,对比两个系统版本,硬件设备来看,推测原因有如下几种可能:

  • 处理器架构不同

    • Ubuntu 是安装在 win10 台式机上的虚拟机中,所使用的硬件应该为台式机的硬件(处理器等);而台式机的硬件是英特尔的 X86 架构的处理器。

    • 树莓派使用的硬件平台,是一个 ARM 架构的芯片,具体可以参考图片:

图片来源:树莓派实验室
  • gcc 版本不同,在刚开始操作的时候,也详细的列出了当前程序使用的环境

    • Ubuntu14.04 中 gcc  版本为:4.8.2

    • 树莓派中 gcc 版本为:8.3.0

  目前能想到的差异就这么多,其他的暂时还不知道,难道这个就是运行在 X86 平台和 ARM 平台的区别之一?更多的更深入的研究还有待后续学习研究才能知道。今天的讨论就到这里为止吧!

总结

  1. 在 X86 架构平台下,外小内大效率较高;

  2. 由于参考的规范手册,可能是用于服务器开发,而服务器仍然是 X86 架构的处理器居多,因此 for 循环的多重循环规则较适用;

  3. 需要考虑在嵌入式等 ARM 平台下,此规则是否同样适用,是否还有其他应用场景限制等?欢迎私信/加我好友一起讨论~

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

多重 for 循环,如何提高效率?相关推荐

  1. matlab循环语句提高效率,matlab – 循环语句性能并预先分配循环语句本身

    这种观察并不重要,因为浪费在循环语句上的时间性能可能远高于循环本身.但无论如何,我会分享它,因为我搜索并找不到关于此的话题.我总是有这样的印象:预先分配我将循环的数组,然后循环它,将比直接循环它更好, ...

  2. matlab循环语句提高效率,matlab循环语句for怎么用

    matlab循环语句for怎么用 matlab循环语句for怎么用? matlab中for语句使用方法和应用实例 for循环语句 1.一般格式为: for x(循环变量) = array(数组) co ...

  3. 【初级C语言】表达式和基本语句(布尔型与0比较,浮点型与0比较,switch语句,提高循环语句的效率)

    一.运算符的优先级 1.如果代码行中的运算符比较多,要用括号确定表达式的操作顺序.以防止产生歧义并提高可读性. 2.即使掌握了各个运算符的运算规则(顺序,结合性等)仍可能写出一个不能确定唯一计算路径的 ...

  4. C++循环语句的效率

    C++循环语句的效率 C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用.本节重点论述循环体的效率.提高循环体效率的基本办法是降低循环体的复杂性. [建议4-4-1]在多 ...

  5. 多重for循环优化,提升运行效率

    在循环次数较少的时候一般不会发现for循环的写法会对效率产生多大问题,但一旦循环次数较多,比如说上万,循环层数较多,效率问题就非常明显了,我是在做一个数据量非常大有三层for循环的项目的时候,为显示曲 ...

  6. 多重 for 循环优化,提升运行效率

    在循环次数较少的时候一般不会发现 for 循环的写法会对效率产生多大问题,但一旦循环次数较多,比如说上万,循环层数较多,效率问题就非常明显了,我是在做一个数据量非常大有三层 for 循环的项目的时候, ...

  7. GTD (Getting Things Done)时间管理 提高效率 简介

    目录 一.GTD可能并不是你认为的GTD 二.GTD的作用原理 三.五个步骤的优化方法 1.收集:设置生肉库 2.判断:为"生肉"打标签 3.整理:清空生肉库 4.复查:执行前的最 ...

  8. oracle批量查询更新,Oracle批量查询、删除、更新使用BULK COLLECT提高效率

    BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记. 例1: 批量查询项目资金账户号为 & ...

  9. 除了ChatGPT,还能用什么计划管理软件提高效率?

    最近一段时间,人工智能工具ChatGPT成为互联网科技圈的热门话题.正如当年的阿尔法狗给世界带来的震动一样,人们讨论的最多的就是:ai智能会不会取代人工,因为ai的效率太高了,但再智能,也有ai永远也 ...

  10. 提高效率的Java代码优化小技巧

    可以提高效率的Java代码优化小技巧 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面 ...

最新文章

  1. webapi控制器怎么接收json_一个秒杀系统的登录系统到底是怎么工作的
  2. java ipmitool_ipmitool使用手册(20200401)
  3. php怎么四舍五入,php 四舍五入的三种实现方法
  4. 中国陶瓷辊棒市场全景调查及供需格局预测报告2022-2028年版
  5. 玩转 IntelliJ IDEA 2020
  6. C++中两个类中互相包含对方对象的指针问题
  7. 解决ifconfig没有网卡问题
  8. 走在网页游戏开发的路上
  9. Atitit flowable使用总结 目录 1. flowable 1 1.1. 添加依赖 1 1.2. Flowable的启动接口 2 2. 还是使用简单流程来完成业务流程的学习, 2 2.1.
  10. scala访问MySQL数据库
  11. 为金蝶K3页面增加批量导入选项(其它出库、其它入库、调拨单、生产领料、外购入库、成本调整)
  12. html 预加载图片,实现网页图片预加载的几个方法
  13. 冰点还原精灵如何卸载
  14. 广东第一高中生_广东高中排行榜TOP10,有你的母校吗?
  15. 树莓派Linux-raspberrypi域名解析失败:Temporary failure in name resolution
  16. Linux基础 第三节 第二课
  17. android常用控件实验报告,常用控件的编程实验报告
  18. 全国大学生计算机技能应用(2020年)——C++科目决赛程序设计题解
  19. Python爬取英雄联盟职业比赛数据
  20. unity报错,提示找不到vcruntime140

热门文章

  1. nodejs express
  2. 不要学习代码,要学会思考(转)
  3. Ubuntu Server 分区案例
  4. 使用RMAN备份数据库
  5. 第九周项目6-穷举法之年龄几何
  6. 国外知名的开源项目托管网站
  7. “BindingNavigator”如何在删除前弹出确认框?
  8. Run ASMX Without IIS
  9. C++包扩展_利用 MATLAB Coder 将M代码生成C/C++代码
  10. mysql中的内置函数