为什么数组遍历比链表快,从CPU和内存的角度理解。

理解数组遍历比链表快的原因,可以从CPU的缓存机制和内存读取角度出发。CPU优先从缓存读取数据,数组的连续内存布局有利于整块读取,而链表的跳跃式地址容易导致缓存失效,从而降低效率。通过64位CPU的示例,展示了遍历顺序对性能的影响,先遍历列会跳出处在缓存行的数组元素,导致速度下降,链表的情况类似。
摘要由CSDN通过智能技术生成

      回家的路上看了一下cpu的结构,想起了前两天和领导吃饭时聊到的问题,为什么数组遍历比链表快,明明都知道地址了。

      其实要理解这个问题,从cpu的结构和内存角度来理解就很清晰了。

      读取速度:缓存>内存(剧吐多少倍差距,得看什么cpu,大概都有100倍左右)。

      cpu读取数据是按照缓存行读取到缓存的,简单来说就是cpu会把需要的数据加载到缓存中,查找数据时,会先从缓存找,找不到再到内存找。

      而数组作为连续内存,cpu缓存会把一片连续的内存空间读入,这样连续内存的数组会更易于整块读取到缓存中,当进行遍历时,直接命中缓存。而链表是跳跃式的地址,很轻易就会跳出缓存,跑到内存中去查找数据。所以会慢很多。

看下面的程序

#include <time.h>
#include <stdio.h>

void show_arr_addr(){
	long arr[2][8];
	for(int i=0; i<2; i++)
	{
		printf("row addr:%X\n", arr[i]);
		printf("column addr: ");
		for(int j=0; j<8; j++)
		{
			printf("%X, ", &arr[i]
  • 20
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值