簡體   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