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