web-dev-qa-db-fra.com

Pourquoi la localité du cache est-elle importante pour les performances de la baie?

Dans ce qui suit blog il y a une déclaration sur l'avantage des tableaux sur les listes liées:

Les baies ont une meilleure localité de cache qui peut faire une grande différence dans les performances.

Qu'est-ce que ça veut dire? Je ne comprends pas comment la localité de cache peut fournir un énorme avantage en termes de performances.

55
Vaibhav Mishra

Voir ma réponse sur la localité spatiale et temporelle .

En particulier, les tableaux sont des blocs de mémoire contigus, de sorte que de gros morceaux d'entre eux seront chargés dans le cache lors du premier accès. Cela rend relativement rapide l'accès aux futurs éléments du tableau. Les listes liées, en revanche, ne sont pas nécessairement dans des blocs de mémoire contigus et pourraient entraîner davantage de ratés de cache, ce qui augmente le temps nécessaire pour y accéder.

Tenez compte des dispositions de mémoire possibles suivantes pour un tableau data et une liste liée l_data de grandes structures

Address      Contents       | Address      Contents
ffff 0000    data[0]        | ffff 1000    l_data
ffff 0040    data[1]        |   ....
ffff 0080    data[2]        | ffff 3460    l_data->next
ffff 00c0    data[3]        |   ....
ffff 0100    data[4]        | ffff 8dc0    l_data->next->next
                            | ffff 8e00    l_data->next->next->next
                            |   ....
                            | ffff 8f00    l_data->next->next->next->next

Si nous voulions parcourir ce tableau, le premier accès à ffff 0000 nous obligerait à aller en mémoire pour récupérer (une opération très lente dans les cycles CPU). Cependant, après le premier accès, le reste du tableau serait dans le cache et les accès ultérieurs seraient beaucoup plus rapides. Avec la liste chaînée, le premier accès à ffff 1000 nous obligerait également à nous souvenir. Malheureusement, le processeur mettra en cache la mémoire entourant directement cet emplacement, par exemple jusqu'à ffff 2000. Comme vous pouvez le voir, cela ne capture aucun des autres éléments de la liste, ce qui signifie que lorsque nous allons accéder à l_data->next, nous devrons de nouveau aller en mémoire.

81
brc

En règle générale, lorsque vous utilisez un tableau, vous accédez à des éléments proches les uns des autres. Cela est particulièrement vrai lors de l'accès séquentiel à un tableau.

Lorsque vous accédez à la mémoire, une partie de celle-ci est mise en cache à différents niveaux. localité du cache fait référence à la probabilité que des opérations successives soient dans le cache et donc plus rapides. Dans un tableau, vous maximisez les chances d'accès séquentiel aux éléments dans le cache.

Avec les listes, par contre-exemple, il n'y a aucune garantie que les éléments qui apparaissent séquentiellement dans la liste sont réellement disposés les uns à côté des autres en mémoire. Cela signifie moins de hits de cache et des performances dégradées.

7
paddy