3 votes

Performances et "meilleures pratiques" : avec une déclaration vs. une fonction avec un tas de paramètres

J'ai fait beaucoup de templating en JS ces derniers temps, et j'ai donc invariablement rencontré le "méchant" with déclaration.

Il est beaucoup plus facile de travailler avec les modèles, car vous n'avez pas à faire précéder vos variables d'un objet.

Entendre que les déclarations avec sont mauvaises et aussi qu'elles mai en raison des mauvaises performances, j'ai cherché une autre solution :

Ma solution : Fonction avec un bouquet de fleurs de paramètres

Voici mon code :

var locals = {
  name : "Matt",
  email : "wahoo@wahoo.com",
  phone : "(555) 555-5555"
};

var keys = [];
var values = [];

for (key in locals) {
  local = locals[key];

  keys.push(key)
  values.push(local);

}

keys = keys.join(',');

var fn = new Function(keys, "**TEMPLATE STUFF**"); // function(name, email, phone) {...}
fn.apply(this, values); // fn("Matt","wahoo@wahoo.com","(555) 555-5555")

Remarque : ces deux éléments accomplissent exactement la même chose. Elles sont toutes les deux abstraites de tout le monde, donc une liste de paramètres odieusement longue n'est pas un problème.

Je me demande ce qui est le mieux : utiliser une instruction with ou une fonction avec le potentiel d'un nombre fou de paramètres.

À moins que quelqu'un n'ait une meilleure solution... ?

Merci ! Matt Mueller

1voto

davin Points 19682

Je trouve votre solution très gonflée. Elle est totalement non triviale, alors que with est si simple (une ligne de code qui, en soi, a un coût très faible par rapport à vos traversées d'objets et instanciations de tableaux). De plus, votre solution nécessite un objet template prêt lors de la création de la fonction template (pour définir ses paramètres), ce qui peut s'avérer à terme moins flexible à mon avis.

Vérifiez MDC . Un modèle bien conçu devrait avoir peu de logique et beaucoup de références à des variables (et si ce n'est pas le cas, il devrait l'être ! with est le candidat idéal dans une telle situation, car il ne devrait y avoir que très peu d'autres recherches dans le champ d'application de la fonction with .

Toute performance supplémentaire qui pourrait être gagnée semble être une micro-optimisation, bien que plutôt que de théoriser, il suffit d'effectuer quelques benchmarks. http://jsperf.com/with-vs-fn fait tout le code de configuration avant le benchmark pour votre version, mais effectue le with pendant l'exécution de la fonction, donc ce n'est pas vraiment juste, bien que même sur les itérations les plus lentes, vous avez une idée de la vitesse ; >400 000 ops/sec est le plus lent. Je ne pense pas que vous ayez besoin de rendre plus de 400 000 modèles par seconde...

1voto

Mic Points 13418

Avez-vous essayé un moteur de templating JS ? Ils sont généralement très rapides et vous permettent d'économiser du code de rendu.

Je suis l'auteur de pure.js qui est un peu original, mais il y en a beaucoup d'autres disponibles et pour tous les goûts.

0voto

Matthew Wilson Points 2628

Les problèmes de with ne sont pas des performances, mais de l'ambiguïté et des comportements imprévisibles.

Voir, par exemple, Fonctions cachées de JavaScript ?

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