当前位置: 首页 > 知识库问答 >
问题:

处理存储器的连续块与非连续块时的效率

轩辕季同
2023-03-14

我有一个结构

struct A
{
int v[10000000];
};

如果我有a[2];并且希望计算值的总和,这两种方法中哪一种是最快的?

int method_1(const A &a[],int length)
{
int total = 0;
for(int i=0;i<length;i++)
for(int j=0;j<10000000;j++)
total+=a[i][j];

return total;
}


int method_2(const A &a[],int length)
{
int total = 0;
for(int j=0;j<10000000;j++)
for(int i=0;i<length;i++)
total+=a[i][j];

return total;
}

A[2]被声明为结构A的两个连续块,如下所示:

编辑

我已将v大小从32更改为10000000,因为显然不理解我指的是一般情况

共有1个答案

狄旭
2023-03-14

每读取一个内存片段,就会有一整条高速缓存行从主内存读取到CPU高速缓存,今天可能会有一条32字节长的高速缓存行。主要是因为这样,读取连续的存储块是快速的。

现在有多条高速缓存线...

在您的例子中,这两种情况可能具有相似的性能,因为两个阵列很可能不会冲突到相同的高速缓存行中,所以这两个阵列可能在不同行的高速缓存中,所以我怀疑性能会相似。

int method_1(const A &a[],int length)
{
    int total = 0;
    for(const A* aIt=a;aIt<a+length;++aIt)
        for(const v* vIt=aIt->v;vIt<aIt->v+10000000;++vIt)
            total+=*vIt;

    return total;
}
 类似资料:
  • 问题内容: (现已失效)页面http://stream.twitter.com/1/statuses/sample.json用于返回连续无休止的JSON数据流。 我想在自己的网页中使用jQuery(或JavaScript,但最好是jQuery)对其进行处理,以便能够基于实时推文显示视觉效果。 据我所知,jQuery 函数仅在服务器发送完所有数据后才执行回调函数,但这实际上是连续的数据流。我如何“按

  • 本文向大家介绍连续和非连续内存分配之间的区别,包括了连续和非连续内存分配之间的区别的使用技巧和注意事项,需要的朋友参考一下 在这篇文章中,我们将了解连续和非连续内存分配之间的区别- 连续内存分配 在这种分配类型中,连续的内存块被分配给一个文件/进程。 与不连续的内存相比,它执行得更快。 易于通过操作系统进行控制。 开销最小,因为在执行进程时地址转换不多。 连续内存分配中存在内部碎片。 有不同类型的

  • 我已经为我的计划问题调整了课程时间安排示例......但我不知道如何确保连续或形容词周期。我的日程计划有活动,每个活动都有一个持续时间,我已将其转换为周期。例如......一个活动大约是120分钟,而时间段大约是30分钟,所以我创建了4个时隙活动。这种方式似乎很容易使活动适应不同的时期......但我找不到一种简单的方法来确保所有这些时隙活动必须是连续的。关于如何实现这一点有什么想法吗? 提前感谢

  • 问题内容: 我刚遇到以下问题。 这是我第一次看到这个。它是如何工作的? 问题答案: 它只是编写两个不同的代码块以隐藏局部变量。 从问题“ Java中的匿名代码块”的答案: 块限制变量范围。 但是,实际上,如果您发现自己使用了这样的代码块,则可能是您要将其重构为方法的信号。

  • 问题内容: 我在MySql 5中有一个电话号码表。简单的结构是 记录如下 我需要对这些数据进行排序,并将连续的数字块分组为数字范围。我愿意在C#LINQ中实现该解决方案,但服务器端MySql是一等奖。MySql中是否有一种方法可以汇总此数据,以便输出如下所示? 问题答案: 有一个简单的技巧可以将连续的条目折叠成一个组。如果按(row_number-entry)进行分组,则连续的条目将在同一组中结束

  • 请先按(按住)箭头键,然后按非箭头键,测试以下代码。至少在Mac中,你会看到箭头键不断地应用它们的功能,而其他键则没有。有没有人知道如何使其他键在处理过程中连续应用(即不通过改变OSX的功能)?