Меня всегда мучил вопрос, какая разница в производительности при использовании JavaScript класса созданного, с и без использования прототипов. Вот интерес победил и я написал небольшой тест. Но для начала посмотрим на соперников.
Соперники
Соперники готовы, теперь можно и сравнить скорость (выполнить):
А теперь вспомним наш последний проект с использование JavaScript, сколько раз в нем создаются объекты? Если до 10 000 созданий, то можно смело выбирать NoPrototypе стиль, иначе - стоит использовать Prototypе.
Соперники
- Класс в NoPrototype стиле:
var NoPrototypeClass = function () {
var self = this;
self.i = 0;
self.Metod1 = function () {
self.i++;
};
self.Metod2 = function () {
self.i++;
};
self.Metod3 = function () {
self.i++;
};
self.Metod4 = function () {
self.i++;
};
self.Metod5 = function () {
self.i++;
};
};
- Класс в Prototype стиле:
function PrototypeClass() {
this.i = 0;
}
PrototypeClass.prototype.Metod1 = function () {
this.i++;
};
PrototypeClass.prototype.Metod2 = function () {
this.i++;
};
PrototypeClass.prototype.Metod3 = function () {
this.i++;
};
PrototypeClass.prototype.Metod4 = function () {
this.i++;
};
PrototypeClass.prototype.Metod5 = function () {
this.i++;
};
Соперники готовы, теперь можно и сравнить скорость (выполнить):
function getTime() {
var day = new Date();
return day.getTime();
}
var noPrototypeTimes = [];
var prototypeTimes = [];
for (var step = 2; step <= 5; step++) {
var iterationCount = Math.pow(10, step);
var start = getTime();
for (var i = 0; i < iterationCount; i++) {
var c1 = new NoPrototypeClass();
c1.Metod1();
c1.Metod2();
c1.Metod3();
c1.Metod4();
c1.Metod5();
}
var end1 = getTime();
for (var i = 0; i < iterationCount; i++) {
var c2 = new PrototypeClass();
c2.Metod1();
c2.Metod2();
c2.Metod3();
c2.Metod4();
c2.Metod5();
}
var end2 = getTime();
noPrototypeTimes.push((end1 - start) / 1000);
prototypeTimes.push((end2 - end1) / 1000);
}
alert("NoPrototype times: " + noPrototypeTimes.toString().replace(/,/g, " ") + "\n"
+ "Prototype times: " + prototypeTimes.toString().replace(/,/g, " "));
Результат. NoPrototype стиль вполне не плохо справляется с большим количеством итераций, но все же уступает Prototype стилю. На моей домашней машинке выдаются вот такие результаты:
100 |
1 000 |
10 000 |
100 000 |
|
IE8 |
||||
NoPrototype |
0,001 |
0,016 |
0,16 |
1,612 |
Prototype |
0,001 |
0,012 |
0,101 |
1,017 |
FF 3.6 |
||||
NoPrototype |
0 |
0,006 |
0,068 |
0,709 |
Prototype |
0 |
0,004 |
0,033 |
0,341 |
Chrome 8 |
||||
NoPrototype |
0 |
0,001 |
0,004 |
0,044 |
Prototype |
0 |
0 |
0,002 |
0,021 |
Комментарии
Отправить комментарий