Question

Considérons la fonction Javascript suivante (1):

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

Maintenant, ce que je n'aime pas cette fonction est que l'exacte même objet est créé à chaque fois que la fonction est appelée. Étant donné que l'objet ne change pas que je préfère créer une seule fois. Donc, nous pourrions faire les ajustements suivants (2):

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

Maintenant l'objet est créé une fois que lorsque le script est chargé et stocké dans dataObject. Mais supposons que setData est appelée uniquement de temps en temps - la plupart du temps que le script est chargé de la fonction n'est pas utilisé. Ce que je n'aime pas cette fonction dans ce cas est que l'objet est toujours créé et conservé en mémoire, y compris de nombreuses occasions où il ne sera jamais utilisé. Je me suis dit que vous pourriez faire quelque chose comme ça pour trouver l'équilibre idéal (3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

Would qui ont du sens? Je figure cela dépend du moment où l'interprète décide de créer un objet. Est-il vraiment attendre jusqu'à ce qu'il passe la condition de !dataObject, ou faut-il entrer dans la fonction, essaie d'être intelligent et décide de construire à l'avance? Peut-être différents moteurs Javascript ont des politiques différentes en ce qui concerne ce sujet?

Alors bien sûr, il y a la question de savoir si ces optimisations jamais d'importance dans la pratique. Il est évident que cela dépend de facteurs tels que la taille de l'objet, la vitesse du moteur, la quantité de ressources disponibles, etc. .. Mais en général, que l'on est selon vous l'optimisation plus importante: de (1) à (2) ou de (2) à (3)?

Était-ce utile?

La solution

La réponse est, vous n'êtes pas censé savoir. Les exemples que vous avez montré ont très peu de différence entre eux. La seule façon que vous auriez jamais raisonnablement inquiéter à ce sujet est si vous aviez des preuves réelles que d'une façon ou d'une autre était noticably nuire les performances ou l'utilisation de la mémoire sur un interprète particulier. Jusque-là, il est le travail de l'interprète à se soucier de ce genre de choses pour vous.

Cela dit, si vous voulez vraiment savoir ... Essayez et savoir. appeler les différentes versions 1.000.000 fois et voir quelle différence cela fait.

Faire une version géante de l'objet et voir si cela fait une dent. Regardez le gestionnaire de tâches. Essayez différents navigateurs. Rapport à vos résultats. Il est une bien meilleure façon de savoir que juste demander à un groupe de saccades sur Internet ce qu'ils devinent pourrait être le cas.

juste garder à l'esprit cet objet doit être en mémoire de toute façon, quelle que soit ... comme texte source

Autres conseils

Un nouvel objet doit être créé - il ne peut pas, en partie parce que la spécification exige, mais surtout parce que le comportement alternatif serait contre-intuitif, prendre:

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

Avez-vous vraiment une nouvelle expression de l'objet pour produire pas réellement l'objet que vous demandez? Parce que ce que vous semblez vouloir.

vous voulez juste peut concevoir faire:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

Ce qui obtiendrait l'effet que vous voulez, même si vous devez comprendre que l'objet que vous êtes de retour est un objet complètement mutable qui peut être changé, et tout le monde serait partager cette même instance muter.

D'abord, je le mettre en œuvre dans la situation # 2 et le charger une fois immédiatement après la page est chargée.

S'il y avait un problème avec la vitesse de la page, je mesurais le temps pour des tâches spécifiques dans la page.

S'il était très cher pour créer l'objet (relativement parlant), alors je proposerais à la situation # 3.

Il est inutile d'ajouter le « si » la déclaration si elle ne vraiment rien acheter ... et dans ce cas, la création d'un simple / grand objet est pas de sueur sur le dos de votre CPU. Sans mesures, vous n'êtes pas l'optimisation - vous êtes juste aveugle tir

.

Il est en fait une méthode assez courante d'initialisation des choses que j'ai personnellement utilisé en C ++ et Java.

Tout d'abord, cette optimisation ne sera jamais d'importance dans la pratique.

En second lieu, la dernière fonction est exactement aussi bonne que la première fonction. Eh bien, presque. Dans le premier, je suppose que vous êtes à la merci du collecteur des ordures, qui devrait détruire l'ancien objet lorsque vous réaffectez domElement.myDataProperty. Pourtant, sans savoir exactement comment le garbage collector fonctionne sur votre plate-forme cible (et il peut être très différente selon les navigateurs), vous ne pouvez pas être sûr que vous enregistrez tout travail du tout vraiment.

Essayez tous les trois d'entre eux dans quelques navigateurs et découvrez qui est plus rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top