Est un unordered_map vraiment plus rapide qu'une carte dans la pratique?

Sûr, la recherche de la performance d'une unordered_map est constante en moyenne, et la recherche de la performance d'une carte est O(logN).

Mais bien sûr dans le but de trouver un objet dans une unordered_map, nous avons:

  1. de hachage de la clé que nous voulons trouver.
  2. equality_compare la clé avec toutes les clés dans le même seau.

Alors que dans une carte, nous avons simplement besoin de less_than comparer les recherchés clé avec log2(N) touches, où N est le nombre d'éléments dans la carte.

Je me demandais ce que la performance réelle différence serait, étant donné que la fonction de hachage ajoute-dessus et un equality_compare est pas moins cher qu'un less_than comparer.

Plutôt que de déranger la communauté avec une question, je peux répondre moi-même, j'ai écrit un test.

J'ai partagé les résultats ci-dessous, au cas où quelqu'un d'autre trouve cela intéressant ou utile.

Plus de réponses sont bien sûr invités si quelqu'un est capable et disposé à ajouter plus d'informations.

Le problème avec map n'est pas le log N en soi; c'est que chaque accès à la mémoire que vous marchez dans l'arbre est essentiellement aléatoire. Ce n'est pas important quand la carte est petite, mais elle domine lorsque la carte est grande. (La différence entre l'accès cache et de la mémoire est un ordre de grandeur ou deux; voir par exemple stackoverflow.com/q/4087280. Et cette différence tend à augmenter à travers le CPU générations parce que le physique est local.) Le égal à/inférieur à opérations sont invisibles par rapport au pointeur de la poursuite.
Jetez un oeil à mes résultats de tests, en particulier la flat_map vs carte. Il semble à première vue que le pointeur de chasser est de la comptabilité pour un doublement de la recherche du temps dans une carte par rapport à un (grand!) triés vecteur. Cependant, il peut y avoir d'autres facteurs en jeu ici. clang semble plus disposé aux commandes de l'ensemble de la recherche pour lower_bound sur un vecteur, que at pour une carte, par exemple.

OriginalL'auteur Richard Hodges | 2016-04-03