如果我有一個鏈接結構是這樣的:在C大結構緩存局部性
struct phonebook {
char LastName[16];
char FirstName[16];
char Email[16];
char PhoneNumber1[10];
char PhoneNumber2[10];
char Addr1[16];
char Addr2[16];
char City[10];
char Country[12];
char State[2];
struct phonebook *pNext;
}
,當我想要搜索的人匹配姓氏,
我可以使用
while (pHead != NULL) {
if (strcasecmp(lastname, pHead->LastName) == 0)
return pHead;
pHead = pHead->pNext;
}
return NULL;
東西像這樣,但每次我得到一個電話簿節點時,緩存都會加載整個結構並且緩存會丟失很多。
那麼,如何增加緩存命中率呢?
如何在緩存中分組LastName
?
沒有熱/冷或中斷鏈表到鏈式散列表中。
請參閱[這個問題重新AoS與SoA](http://stackoverflow.com/questions/5323154/which-kind-of-data-organization-using-c-arrays-makes-fastest-code-and-why/5323220#5323220)。 –
當你說'高速緩存將加載整個結構和高速緩存未命中',是你的猜測或實際分析的結果?這是不太可能的(儘管不是完全不可能的),電話簿應用程序對性能敏感,明顯受到緩存未命中的影響。 – ach
當您使用O(n)查找算法時,無需擔心緩存性能。這是一個難以解決的問題,因爲從緩存和操作複雜性角度來看,'正確'的答案是使用散列表。 – QuestionC