2011-04-17 184 views
0

我不知道有什么可以作为理由,更大的结构访问更慢。为什么更大的结构更慢?

例如。 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; 
} 

小stucture的执行时间(秒)小于第一。 什么是理由?

+1

你怎么测量时间?也许那是你的错误所在。 – Grim 2011-04-17 11:45:03

回答

0

两个建议:

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

其中一个原因可能是缓存效应。尽管链接列表已经显示相当差spatial locality,但增加节点只会加剧这种情况。

0

您还没有给我们完整的图片;列表的分配对性能至关重要,并且很容易使性能测量错误。

假设你刚刚分配了一个连续的块与malloc,第二个版本将执行更好,因为缓存局部性。内存访问非常缓慢,可能成为像您这样的计算成本低廉的程序的关键因素。当CPU获取第一个元素时,它将预取下一个128字节。因此,它将不得不像第一个版本一样访问内存大约一半的时间。

0

这些结构可能在内存中彼此相邻,所以硬件缓存对较小的结构更适用。

当您要求从主存储器中读取整个缓存行时,既然你可以在缓存行中放入更多的小型结构体,你可以完成后续的缓存读取操作,而不必到主存储器慢慢读取。

相关问题