代码运行效率优化--充分利用cache line
2023-12-26 21:37:37
参考:?改了一行代码,数组遍历耗时从10.3秒降到了0.5秒!
两种方式访问二维数组性能比较
1、按行访问二维数组
#include "stdio.h"
int arr[10240][10240];
int main()
{
int i = 0, j = 0;
for (i = 0; i < 10240; i++)
{
for (j = 0; j < 10240; j++)
{
arr[i][j] = i + j; // 按行访问
}
}
return 0;
}
?
2、按列访问二维数组
#include "stdio.h"
int arr[10240][10240];
int main()
{
int i = 0, j = 0;
for (i = 0; i < 10240; i++)
{
for (j = 0; j < 10240; j++)
{
arr[j][i] = i + j;
}
}
return 0;
}
?
3、原因分析:
1)概念1:Cache
CPU都有Cache(高速缓存),通过指令lscpu查看
L1 访问速度最快,内存最少;
?
2)概念2:Cache Line
Cache Line 是Cache 和内存之间进行数据传输的最小单元;
意思就是说:当一个数据被CPU访问时,从内存中读取到Cache中的数据量是以Cache Line为单位的,一般大小为64个字节;所以当访问数组中的一个元素时,会读取这个元素周边的总共64个字节的数据到Cache中;
如此一来,当接下来访问连续的其他的63个字节就会直接从Cache中访问,不用从内存中读取了,加快了数据访问速度;
但是如果按列访问的话,在Cache Line的内存中就找不到需要的数据,就需要重新从内存中读取新的64个字节的数据到Cache中;
文章来源:https://blog.csdn.net/ylxwk/article/details/135229203
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!