代码运行一万遍和运行十万遍耗时一样吗

前言

在B站刷视频的时候看到一个视频,讲的是阿里的一道面试题,觉得很兴趣,在此总结一下。原视频链接:https://www.bilibili.com/video/BV1tv411J7Ap。

问题描述

int i = 0;
int length= 64*1024*1024;
int * arr = (int *)molloc(length);

//循环1
for(i = 0; i < length; i++)
{
	arr[i] *=3;
}

//循环2
for(i = 0; i < length; i +=16)
{
	arr[i] *=3;
}

问题:上面两个循环的耗时相差多少?

问题分析:

1.分析:代码中定义了(60 x 1024 x 1024)个成员的数组,循环1是去遍历所有的成员,循环2是访问1/16的成员。如果耗时和访问次数成线性关系,那么循环2的耗时大约是循环1的16倍;如果不是线性关系,那又是什么原因导致了差异。

问题解决的步骤

1.简单粗暴的验证。直接用代码去测试,发现这两个循环的耗时,相差无几,说明耗时和访问次数不是简单的线性关系。现在已经得到了结论,接下来就是找寻理论依据去支撑这个结论。
2.理清影响耗时的因素。运行代码的过程,大致是把数据从内存读到CPU进行处理,然后写回内存。其中CPU的运行速度是远大于内存的运行速度,读取内存会占用大部分的时间。
3.两个循环访问内存的次数会相差16倍吗?很显然不是的,要不然时间就不会相差无几了。原因是cache的存在,cache分为iCache和dCache,不了解的可以参考博客《ARM芯片开发学习(S5PV210)——icache、dcache介绍和如何开关icache》。CPU去访问一次内存,会将一段数据读到cache里,之后需要数据就先去cache里查找,找不到再去读取内存,而不是每次都要去读内存。cache与内存之间的数据交互是缓存行为单位的,x86架构的缓存行是64字节,16个int型变量刚好64字节,无论你需要读取1个int型变量,还是读取16个int型变量,cache和内存都会交互64字节,所以这两者的耗时没有明显区别。
4.补充:这类似于平时写C语言代码里,用char型变量和int型变量其实耗时都差不多。假设现在是32位的机器,int占4字节,char占1字节,但是无论你访问的是char型变量还是int型变量,CPU都会一次读取4字节内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在起飞的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值