2016-02-15 1 views
3

Je ne suis généralement pas trop préoccupé par les micro-optimisations, jusqu'à ce qu'il s'agisse de la performance javascript UI (en particulier sur mobile) et de garder tout sous les 16.666666667ms saints pour obtenir ce 60fps lisse ininterrompu.La vitesse de 'ceci' vs une variable cachée en javascript?

J'exécute une fonction tick de requestAnimationFrame jusqu'à ce qu'une condition soit remplie, et elle repose sur des valeurs telles que this.velocity, this.translateX etc qui sont définies sur l'instance en cours. Ma question est, devrait ou devrait utiliser une version mise en cache de this comme dans var _this = this; déclaré en dehors de la coche plutôt que de se référer à «tout cela partout être plus rapide». Pour être clair, je vous appelle cela plus que quelques fois .... Heres du code:

swipeIt.prototype.tick = function() { 
    if (Math.abs(this.translateX) < (+this.elWidth*1.2 && this.velocity > 6)) { 


     this.velocity = this.velocity*1.15; 
     this.translateX = (this.dir === 'left') ? this.translateX - this.velocity : this.translateX + this.velocity; 

     requestAnimationFrame(function() { 
      _this._update(_this.updateCb); 
      _this.tick(); 
     }); 

    } else { 
     //.... 
    } 
} 

d'autres suggestions sur l'optimisation de cela plus le bienvenu, est la première fois im vraiment donner un aller solide . à votre santé.

+0

la référence semble être beaucoup plus rapide. – Sunand

+0

pas en fonction de cela http://jsperf.com/this-vs-reference – pushplaybang

Répondre

5

Non, vous ne verrez aucune amélioration par rapport à cela. S'il y a une différence, ce sera une minuscule diminution de performance, à cause de la déclaration supplémentaire.

Vous avez probablement vu quelque chose comme:

var $this = $(this); 

dans jQuery. Cela a beaucoup de sens, car $(this) est cher à évaluer, donc le code qui est jonché de $(this) peut être grandement amélioré en l'affectant à une variable et en utilisant cette variable partout à la place. Dans votre cas, cependant, il n'y a rien de coûteux à évaluer pour économiser. Accès _this prend autant de temps que l'accès this.

+1

Fait intéressant, même si vous avez déjà _une référence, l'utilisation de la référence à la place de 'this' semble également entraîner une légère baisse des performances, au moins sur OS X Chrome (voir [JSPerf] (http://jsperf.com/this-vs-reference)). –

+1

@RyanMuller L'ampleur de ce ralentissement est probablement causée par la façon dont Javascript résout les variables. 'this' est toujours dans la portée la plus proche, mais en ce que JSPerf' a' n'est pas dans la portée de la fonction courante, il doit donc regarder la portée externe pour trouver 'a'. – Paulpro

+0

très intéressant, merci, j'ai aimé ce jsPerf jusqu'à ce que vous me fassiez juste chose à ce sujet ..... convenu re jQuery. Bien que je doive me demander, a) si vous créiez la référence à l'intérieur de la fonction chaque fois qu'il y aurait un coût, et donc il est logique de la sortir, où elle devient plus chère, du point de vue de la mise en œuvre Il y a de la joie à vivre avec un vieil homme «ceci». Je comprends cela dans le sens le plus strict de la question bien que vous ayez raison. – pushplaybang