Może to wydawać się szczególnie niejasnym tematem, jednak staram się poprawić moje podstawy w całym języku JavaScript (w szczególności jego najlepszych i najbardziej wydajnych praktyk).Dlaczego definiowanie funkcji prototypowych JS jest osobno szybsze niż w słowniku?
Podczas testowania teorii w http://jsperf.com/ wymyśliłem niektórych dziwnych wyników:
Załóżmy, że mamy dwa "identyczne" prototypów, zdefiniowane następująco:
Object1
var Object1 = function() {}
Object1.prototype.defaults = {
radius: 400,
up: 1
}
Object1.prototype.centerOffset = function() {
return this.defaults.radius*this.defaults.up;
}
Object2
var Object2 = function() {}
Object2.prototype = {
defaults: {
radius: 400,
up: 1
},
centerOffset: function() {
return this.defaults.radius*this.defaults.up;
}
}
Object1 ma spójne (jeśli marginalne: ~ 3%) przyspieszyć przewagę nad object2 podczas wykonywania następujących prostych czynności:
var o = new Object1();
var offset = o.centerOffset();
&
var o = new Object2();
var offset = o.centerOffset();
można uruchomić testy siebie here. Używam Chrome 25 na OS X 10.6.8.
Co chciałbym wiedzieć, jest to:
- Jaki jest powód (y) dla tej różnicy wydajności?
- Czy to przedstawienie wskazuje na jakąś najlepszą praktykę w javascript?
Z góry dzięki chłopaki.
EDYCJA: Dzięki za odpowiedzi - jak niektórzy wspomnieli, dalsze testy z mojej strony wydają się sugerować, że ten problem to przeglądarka (lub raczej specyficzny dla Javascriptu kompilator). Testowałem dodatkowo w Safari, IE 10 i Firefox. IE 10 i Firefox dały wyniki tak bliskie, że nie różnią się od siebie. Safari wykonał operacje na Object2 nieco szybciej niż te w Object1 (średnio około 2%). Chciałbym wiedzieć, co jest jednak wartością odstającą (Other), ponieważ różnica w wydajności w tym przypadku wydaje się być znaczna.
To prawdopodobnie tylko wskazówka na dziwactwo V8. – delnan
Miałem odwrotny wynik, uruchamiając firefox –
Fascynujące, więc jego specyficzny kompilator ... Zrobię więcej testów przeglądarki i zgłoś się. –