繁体   English   中英

为什么从较大的结构减速到较慢的结构?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM