Pourquoi ne cache localité d'importance pour les performances de la baie?
Dans la suite de blog il y a une déclaration au sujet de l'avantage de tableaux sur les listes chaînées:
Tableaux ont une meilleure localité de cache qui peuvent faire une grosse différence dans la performance.
Ça veut dire quoi? Je ne comprends pas comment la localité de cache peut fournir un énorme avantage en termes de performances.
- Si vous comprenez comment cache fonctionne, alors vous aurez également à comprendre 1) "Localité de Référence" est une Bonne Chose, et 2) l'accès aux données à partir de baies est généralement plus susceptibles d'avoir une bonne "localité" que l'accès à ces mêmes données à partir d'une liste.
- Une chose à noter est que même si c'est vrai, une liste liée individuellement combiné avec une zone contiguë de l'allocation peut être un atout énorme, principalement parce que les éléments de transfert d'un conteneur à un autre implique pointeur de la logique. Si vous regardez à la disposition de la mémoire de ceux, cependant, il est contigu et ressemble à un tableau avec seulement des liens vers le prochain élément dans le tableau, et il est donc encore cache-friendly (au moins jusqu'à ce que la liste est tout rénové).
Vous devez vous connecter pour publier un commentaire.
Voir ma réponse sujet spatiale et temporelle de la localité.
En particulier, les tableaux sont des blocs de mémoire contigus, sorte de gros morceaux d'eux sera chargé dans le cache lors du premier accès. Cela le rend relativement rapide pour accéder à l'avenir des éléments de la matrice. Les listes liées d'autre part ne sont pas nécessairement dans des blocs de mémoire contigus, et pourrait conduire à plus de défauts de cache, ce qui augmente le temps qu'il faut pour y accéder.
Envisager la suite de possibles mises en mémoire pour un tableau
data
et liste liéel_data
de grandes structuresSi nous voulions une boucle dans ce tableau, le premier accès à
ffff 0000
nous obligerait à aller à la mémoire de récupérer (une très lent fonctionnement en cycles CPU). Cependant, après le premier accès au reste de la matrice sera dans le cache, et les demandes d'accès serait beaucoup plus rapide. Avec la liste liée, le premier accès à laffff 1000
serait également nous obliger à aller à la mémoire. Malheureusement, le processeur mémoire cache la mémoire directement autour de ce lieu, disons tout le chemin jusqu'àffff 2000
. Comme vous pouvez le voir, ce n'est pas réellement la capture de l'un des autres éléments de la liste, ce qui signifie que lorsque nous allons à l'accèsl_data->next
, nous allons encore avoir à aller à la mémoire.Généralement, lors de l'utilisation d'un tableau et que vous accéder à des éléments qui sont à proximité les uns des autres. Cela est particulièrement vrai lors de l'accès à un tableau de manière séquentielle.
Lorsque vous accéder à la mémoire, un morceaux sont mis en cache à différents niveaux. La localité de Cache fait référence à la probabilité d'une succession d'opérations en cours dans le cache et donc d'être plus rapide. Dans un tableau, vous maximisez les chances de séquentielles accès à l'élément de l'être dans le cache.
Avec des 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 près de l'autre dans la mémoire. Cela signifie moins de cache, et de la dégradation des performances.