[英]Why poiner to bigger structure is slower?
我不知道这是什么原因,使Poiner进入较大结构的速度较慢。
例如。 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;
}
较小结构的执行时间(秒)小于第一时间。 可能是什么原因?
原因之一可能是缓存效果。 尽管链表已经显示出非常差的空间局部性 ,但使节点变大只会加剧这种情况。
您还没有给我们完整的图片; 列表的分配对于性能至关重要,并且很容易出错。
假设您刚刚使用malloc
分配了连续的块,由于缓存的局部性,第二个版本的性能会更好。 内存访问非常慢,并且可能是影响像您这样的计算廉价程序的性能的关键因素。 当CPU提取第一个元素时,它将预取下一个元素,例如128个字节。 因此,它将必须像第一个版本一样访问存储器的一半时间。
这些结构可能在内存中彼此相邻,因此硬件缓存对于较小的结构更好地工作。
当您要求从主内存中读取时,将读取整个缓存行。 由于您可以在高速缓存行中容纳更多的小结构,因此您可以从高速缓存中执行后续读取,而不必花很多时间去主内存。
两个建议:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.