我想知道可能是什么原因,对较大结构的访问速度较慢。
例如。 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;
}
较小结构(第二个)的执行时间小于第一个。 可能是什么原因?
答案 0 :(得分:1)
一个原因可能是缓存效果。虽然链接列表已经显示非常糟糕spatial locality,但使节点更大只会加剧这种情况。
答案 1 :(得分:0)
你没有给我们全面的了解;列表的分配对性能至关重要,并且很容易使性能测量错误。
假设您刚刚使用malloc
分配了一个连续的块,则第二个版本因缓存局部性而表现更好。内存访问速度非常慢,可能是像你这样的计算成本低廉的程序性能的关键因素。当CPU获取第一个元素时,它将预取下一个元素,比如128字节。因此,它必须像第一个版本一样访问内存大约一半的时间。
答案 2 :(得分:0)
结构可能在内存中彼此相邻,因此硬件缓存对于较小的结构更有效。
当您要求从主存储器读取时,将读取整个缓存行。由于您可以在缓存行中放置更多小结构,因此您可以完成从缓存中的后续读取,而不必转到主内存,这要慢得多。
答案 3 :(得分:0)
两个建议: