J'ai un modèle avec peut-être des milliers d'objets. Je me demandais quel serait le moyen le plus efficace de les stocker et de récupérer un seul objet une fois que j'ai son identifiant. Les identifiants sont des nombres longs.
Voici donc les 2 options auxquelles je pensais. dans la première option, c'est un simple tableau avec un index incrémentiel. dans l'option 2, c'est un tableau associatif et peut-être un objet, si cela fait une différence. Ma question est de savoir lequel est le plus efficace, lorsque j'ai principalement besoin de récupérer un seul objet, mais aussi parfois de les parcourir et de les trier.
Option 1 avec tableau non associatif:
var a = [{id: 29938, name: 'name1'},
{id: 32994, name: 'name1'}];
function getObject(id) {
for (var i=0; i < a.length; i++) {
if (a[i].id == id)
return a[i];
}
}
Option deux avec tableau associatif:
var a = []; // maybe {} makes a difference?
a[29938] = {id: 29938, name: 'name1'};
a[32994] = {id: 32994, name: 'name1'};
function getObject(id) {
return a[id];
}
Mettre à jour:
OK, je comprends que l'utilisation d'un tableau dans la deuxième option est hors de question. Donc, la ligne de déclaration, la deuxième option devrait vraiment être: var a = {};
et la seule question est: qu'est-ce qui fonctionne le mieux pour récupérer un objet avec un id donné: un tableau ou un objet où l'id est la clé.
et aussi, la réponse changera-t-elle si je devrai trier la liste plusieurs fois?
la source
Réponses:
La version courte: les tableaux sont généralement plus rapides que les objets. Mais il n'y a pas de solution correcte à 100%.
Mise à jour 2017 - Test et résultats
Message original - Explication
Il y a des idées fausses dans votre question.
Il n'y a pas de tableaux associatifs en Javascript. Seuls les tableaux et les objets.
Ce sont des tableaux:
C'est aussi un tableau:
Il s'agit essentiellement d'un tableau avec des trous, car chaque tableau a une indexation continue. C'est plus lent que les tableaux sans trous. Mais l'itération manuelle dans le tableau est encore plus lente (surtout).
Ceci est un objet:
Voici un test de performance de trois possibilités:
Lookup Array vs Holey Array vs Test de performances des objets
Une excellente lecture sur ces sujets dans Smashing Magazine: Ecrire du JavaScript rapide et efficace en mémoire
la source
if (a1[i].id = id) result = a1[i];
Devrait être:if (a1[i].id === id) result = a1[i];
Test http://jsperf.com/array-vs-object-performance/37 corrige celaCe n'est pas du tout une question de performance, car les tableaux et les objets fonctionnent très différemment (ou sont censés le faire, du moins). Les tableaux ont un index continu
0..n
, tandis que les objets mappent des clés arbitraires à des valeurs arbitraires. Si vous souhaitez fournir des clés spécifiques, le seul choix est un objet. Si vous ne vous souciez pas des clés, c'est un tableau.Si vous essayez de définir des clés arbitraires (numériques) sur un tableau, vous avez vraiment une perte de performances , car comportementalement le tableau remplira tous les index intermédiaires:
(Notez que le tableau ne contient pas réellement 99
undefined
valeurs, mais il se comportera de cette façon puisque vous [censé être] itérer le tableau à un moment donné.)Les littéraux pour les deux options devraient indiquer très clairement comment elles peuvent être utilisées:
la source
user_id
" vs "ayant des clés,user_id
ce qui permet d'accéder à l'objet utilisateur enuser_id
tant que clé"? Lequel est le meilleur en termes de performances? Toutes les suggestions à ce sujet sont appréciées :)Avec ES6, le moyen le plus performant serait d'utiliser une carte.
Vous pouvez utiliser les fonctionnalités ES6 aujourd'hui en utilisant un shim ( https://github.com/es-shims/es6-shim ).
Les performances varient en fonction du navigateur et du scénario. Mais voici un exemple où
Map
est le plus performant: https://jsperf.com/es6-map-vs-object-properties/2RÉFÉRENCE https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
la source
efficiency
.Dans NodeJS, si vous connaissez le
ID
, le bouclage dans le tableau est très lent par rapport àobject[ID]
.Et les résultats:
Même si l'ID de recherche est le premier dans le tableau / objet:
la source
J'ai essayé de faire passer cela à la dimension suivante, littéralement.
Étant donné un tableau à 2 dimensions, dans lequel les axes x et y ont toujours la même longueur, est-il plus rapide de:
a) recherchez la cellule en créant un tableau à deux dimensions et en recherchant le premier index, suivi du deuxième index, c'est-à-dire:
ou
b) créez un objet avec une représentation sous forme de chaîne des coordonnées x et y, puis effectuez une seule recherche sur cet objet, c'est-à-dire:
Résultat: il
s'avère qu'il est beaucoup plus rapide d'effectuer deux recherches d'index numériques sur les tableaux qu'une seule recherche de propriété sur l'objet.
Résultats ici:
http://jsperf.com/arr-vs-obj-lookup-2
la source
Cela dépend de l'utilisation. Si le cas est la recherche d'objets est très rapide.
Voici un exemple de Plunker pour tester les performances des recherches de tableaux et d'objets.
https://plnkr.co/edit/n2expPWVmsdR3zmXvX4C?p=preview
Vous verrez cela; Recherche de 5.000 articles dans une collection de 5.000 longueurs, prenez le contrôle de
3000
millisecondesCependant, la recherche de 5.000 éléments dans l'objet a 5.000 propriétés, prendre seulement
2
ou3
milliseconsFaire une arborescence d'objets ne fait pas non plus une énorme différence
la source
J'ai eu un problème similaire auquel je suis confronté où je dois stocker des chandeliers en direct à partir d'une source d'événements limitée à x éléments. Je pourrais les avoir stockées dans un objet où l'horodatage de chaque bougie agirait comme clé et la bougie elle-même agirait comme valeur. Une autre possibilité était que je puisse le stocker dans un tableau où chaque élément était la bougie elle-même. Un problème avec les bougies en direct est qu'elles continuent d'envoyer des mises à jour sur le même horodatage où la dernière mise à jour contient les données les plus récentes.Par conséquent, vous mettez à jour un élément existant ou en ajoutez un nouveau. Voici donc une belle référence qui tente de combiner les 3 possibilités. Les tableaux de la solution ci-dessous sont au moins 4x plus rapides en moyenne. N'hésitez pas à jouer
La conclusion 10 est la limite ici
la source
Si vous avez un tableau trié, vous pouvez effectuer une recherche binaire et c'est beaucoup plus rapide qu'une recherche d'objet, vous pouvez voir ma réponse ici:
Comment rechercher plus rapidement dans un tableau trié en utilisant Javascript
la source