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.
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.
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.