Если у меня есть сшитая структура, как это:Cache местность с большими структурами в 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
s в кеше?
Без горячего/холодного или перерыв связанного списка в цепочку хеш-таблицы.
См. [Этот вопрос re AoS versus 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