72 votes

Performances de la recherche de clés dans un objet JavaScript

Je viens de lire cette question : existe-t-il des dictionnaires en javascript comme en python ?

Une des réponses disait que vous pouvez utiliser les objets JavaScript comme des dictionnaires Python. Est-ce vrai ? Quelle est la performance d'une recherche de clé dans un objet ? Est-ce O(1) ? L'ajout d'une clé à l'objet se fait-il aussi en temps constant (hachage) ?

73voto

Domenic Points 40761

El Documents de conception V8 Les recherches impromptues seront au moins aussi rapides, sinon plus :

La plupart des moteurs JavaScript utilisent une structure de données de type dictionnaire comme stockage des propriétés des objets - chaque accès à la propriété nécessite un une recherche dynamique pour déterminer l'emplacement de la propriété en mémoire. Cette approche Cette approche rend l'accès aux propriétés en JavaScript beaucoup plus lent que l'accès aux variables d'instance dans des langages de programmation comme Java et Smalltalk. Dans ces langages, les variables d'instance sont situées à des décalages fixes déterminés par le compilateur en raison de la disposition fixe des objets définie par la classe de l'objet. L'accès est simplement une question de chargement ou stockage en mémoire, qui ne nécessite souvent qu'une seule instruction.

Pour réduire le temps nécessaire à l'accès aux propriétés JavaScript, V8 procède comme suit n'utilise pas la recherche dynamique pour accéder aux propriétés. Au lieu de cela, V8 crée dynamiquement crée des classes cachées en coulisse. [...] Dans V8, un objet change sa classe cachée lorsqu'une nouvelle propriété est ajoutée.

Il semble que l'ajout d'une nouvelle clé pourrait être légèrement plus lent, cependant, en raison de la création de classe cachée.

27voto

Peter Points 2006

Oui, vous pouvez supposer que l'ajout d'une clé, et son utilisation ultérieure pour l'accès sont efficacement des opérations à temps constant.

Sous le capot, le moteur JS peut appliquer certaines techniques pour optimiser les recherches ultérieures, mais pour les besoins de tout algorithme, vous pouvez supposer O(1).

2 votes

Comparez avec var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); Quelle est l'efficacité de var second={'1': one, '2': two, '3': 'three'} ?

5voto

Valeriy Katkov Points 546

Jetez un coup d'œil à une question similaire Comment la VM JavaScript met-elle en œuvre l'accès aux propriétés des objets ? et le réponse . J'ai décrit ici la technique d'optimisation utilisée par les moteurs JS et comment elle affecte la performance de la recherche de clés. J'espère que ces détails vous aideront à écrire du code JS plus efficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X