Я изучаю Объект генератора JavaScript (функция *), чтобы улучшить производительность моего кода. Поэтому я начал тестирование простого итератора, созданного с помощью функции *, и простого итератора, созданного с помощью классического объекта.
К моему удивлению, функция * кажется худшим решением, поэтому я должен был сделать что-то не так.
Здесь код, который я тестировал на DevTools Console (Opera Browser), и результаты теста.
function CounterObject(i) {
this.init = i;
this.next = function(){
return {value:++this.init};
}
}
function* CounterGenerator(i) {
while(1) yield i++;
}
function benchmark(iterations) {
console.time("CounterObject");
c1 = new CounterObject(0);
for (i=0;i<iterations;i++) c1.next();
console.timeEnd("CounterObject");
console.time("CounterGenerator");
c2 = CounterGenerator(0);
for (i=0;i<iterations;i++) c2.next();
console.timeEnd("CounterGenerator");
}
Результаты испытаний:
> benchmark(10e5)
CounterObject: 10.68310546875ms
CounterGenerator: 35.446044921875ms
> benchmark(10e6)
CounterObject: 161.285888671875ms
CounterGenerator: 259.275146484375ms
> benchmark(10e8)
CounterObject: 14394.56396484375ms
CounterGenerator: 25258.369873046875ms
Что-то не так?
Спасибо.