首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么相同的数组代码的执行时间会有差异?

为什么相同的数组代码的执行时间会有差异?
EN

Stack Overflow用户
提问于 2014-04-02 22:46:13
回答 1查看 142关注 0票数 0

如果我运行以下程序,然后在sum+=arri中交换i和j后再次运行它,则执行时间与交换前的2.7秒相比有很大的不同,即9.8秒。我只是不明白为什么会这样。有人能告诉我为什么会这样吗?

代码语言:javascript
运行
复制
#include<iostream>
#include<time.h>
using namespace std;

int main()
{
    int long sum=0;
    int size = 1024;
    clock_t start, end;
    double msecs;
    start = clock();

    int **arr = new int*[size];
    for (int i = 0; i < size; i++) 
    {
        arr[i] = new int[size];
    }

    for(int kk=0; kk<1000; kk++) 
    {
        sum = 0;
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size ; j++)
            {
                sum += arr[i][j];
            }
        }
    }

    end = clock();  
    msecs = ((double) (end - start)) * 1000 / CLOCKS_PER_SEC;
    cout<<msecs<<endl<<endl;

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-02 22:49:36

这是由于空间局部性造成的。当程序需要内存中的一些数据时,处理器不仅读取特定的数据,而且读取相邻的数据。因此,在下一次迭代中,当您需要下一组数据时,它已经在缓存中了。

在另一种情况下,您的程序无法利用空间局部性,因为您没有在连续迭代中读取相邻数据。

假设您的数据位于内存中,如下所示:

代码语言:javascript
运行
复制
  0  1  2  3  4  5  6  7  8  9 
 10 11 12 13 14 15 16 17 18 19
 20 21 22 23 24 25 26 27 28 29

当您的程序需要读取标记为0的例如数据时,它会读取整行:

0 1 2 3 4 5 6 7 8 9

因此,当您需要标记为1的数据时,它已经在缓存中,您的程序运行得更快。

相反,如果您按列读取数据,这无助于您,每次您得到一个缓存丢失,处理器必须再次进行内存读取。

简而言之,内存读取是昂贵的,这是处理器优化读取以节省时间的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22824553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档