cache命中率对程序运行时间的影响真的很大吗?

这几天看到了一篇博文,叫CPU L2 缓存初探,其中作者想表达L2 cache和L3 cache存在巨大速度差,并且用go编了一段二分查找的程序,“果然”差了六倍有余。
一开始,被忽悠住了,但后来自己用C编了同样一段程序,发现不对劲,得出的结果发现并没有作者那么大的差距,甚至根据运行时间,都察觉不到cache的存在。这才发现,作者的源码有问题,原因是两个对比程序的复杂度差别巨大。
所以,今天写了这篇文章,意在说明各级cache容量大小,以及命中与否,在现在的一般的PC上,基本上是感觉不出来的,除非在空间上有着数量级之差。
下面是实验代码以及实验结果。
思路是在MAXN的数组范围内,随机访问一千万次。得到不同MAXN下的测试时间。
PS:测试机为i5 7300HQ处理器,三级cache分别为32KB,256KB,6MB

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define MAXN 10000000
int num[MAXN];
int random()
{
	return (int)(rand()/(RAND_MAX*1.0)*(MAXN-1));
 }
int find()
{
	return num[random()];
}
int main()
{
	int begin=clock();
	for(int i=0;i<=10000000;i++)
	{
		find();
	}
	printf("%d",clock()-begin);
	return 0;
}

L2 cache作为片内缓存比L3 cache快很多,所以用MAXN=60000和70000来进行对比。
60000x4B(int)<256KB
70000x4B(int)>256KB
MAXN=6E4的时间:216ms
MAXN=7E4的时间:220ms
MAXN=1E6的时间:370-500ms

可见除非有着数量级上的差距,否则多一点空间或少一点空间(即少一些命中或多一些命中)对运行时间是没有太大影响的。

发布了4 篇原创文章 · 获赞 0 · 访问量 210

猜你喜欢

转载自blog.csdn.net/qq_42378281/article/details/105501908