2011-04-17 180 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

這些結構可能在內存中彼此相鄰,所以硬件緩存對較小的結構更適用。

當您要求從主存儲器中讀取整個緩存行時,既然你可以在緩存行中放入更多的小型結構體,你可以完成後續的緩存讀取操作,而不必到主存儲器慢慢讀取。

相關問題