代码运行效率优化--充分利用cache line

发布时间:2023年12月26日

参考:?改了一行代码,数组遍历耗时从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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。