为什么指向更大结构的指针更慢?

时间:2011-04-17 11:39:24

标签: c

我想知道可能是什么原因,对较大结构的访问速度较慢。

例如。 W必须结构:

首先:

typedef struct TAL {
   struct TAL *next;
  int v;
  int a;
  int b;
  int c;
 } LAL;

第二:

typedef struct TAL {
   struct TAL *next;
  int v;
 } LAL;

简单地浏览列表

LAL *tmp;
tmp = AL;

while(tmp != 0)
{
     tmp = tmp -> next;
}

较小结构(第二个)的执行时间小于第一个。 可能是什么原因?

4 个答案:

答案 0 :(得分:1)

一个原因可能是缓存效果。虽然链接列表已经显示非常糟糕spatial locality,但使节点更大只会加剧这种情况。

答案 1 :(得分:0)

你没有给我们全面的了解;列表的分配对性能至关重要,并且很容易使性能测量错误。

假设您刚刚使用malloc分配了一个连续的块,则第二个版本因缓存局部性而表现更好。内存访问速度非常慢,可能是像你这样的计算成本低廉的程序性能的关键因素。当CPU获取第一个元素时,它将预取下一个元素,比如128字节。因此,它必须像第一个版本一样访问内存大约一半的时间。

答案 2 :(得分:0)

结构可能在内存中彼此相邻,因此硬件缓存对于较小的结构更有效。

当您要求从主存储器读取时,将读取整个缓存行。由于您可以在缓存行中放置更多小结构,因此您可以完成从缓存中的后续读取,而不必转到主内存,这要慢得多。

答案 3 :(得分:0)

两个建议:

  • 缓存未命中会降低性能。更大的结构会导致更多的缓存未命中。
  • 也许你衡量时间的方法是错误的。你能告诉我们代码吗?