Я хотел сравнить производительность JS EventEmitter и RxJS. Я написал следующий эталонный сценарий, чтобы сделать это:EventEmitter vs RxJS vs Kefir
Performance Test
import Rx from 'rxjs/Rx';
import Kefir from 'kefir';
import { EventEmitter } from "events";
let Benchmark = require ("benchmark");
let suite = new Benchmark.Suite;
suite
.add('for',() => {
let numArray = [1,2,3,4,5,6,7,8,9,10];
let count = 0;
for (let i = 0; i<numArray.length; i++)
count += numArray[i];
})
.add('forEach',() => {
let numArray = [1,2,3,4,5,6,7,8,9,10];
let count = 0;
numArray.forEach((num) => { count += num; });
})
.add('eventEmitter',() => {
let numArray = [1,2,3,4,5,6,7,8,9,10];
let count = 0;
let myEmitter = new EventEmitter();
myEmitter.on('number', (num) => { count += num; });
numArray.forEach((num) => { myEmitter.emit('number', num); });
})
.add('rxjs',() => {
let numArray = [1,2,3,4,5,6,7,8,9,10];
let count = 0;
let source = Rx.Observable.from(numArray)
.do((x) => { count += x }, (error) => {},() => {});
source.subscribe((x) => {}, (error) => {},() => {});
})
.add('kefir',() => {
let numArray = [1,2,3,4,5,6,7,8,9,10];
let count = 0;
let stream = Kefir.sequentially(0, numArray);
count = stream.scan(sum => sum + 1, 0);
})
.on('cycle', function (event) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Slowest is ' + this.filter('slowest').map('name'));
})
.run({'async': true});
Производительность Результаты
for x 47,595,916 ops/sec ±1.58% (87 runs sampled)
forEach x 4,428,485 ops/sec ±0.75% (86 runs sampled)
eventEmitter x 1,478,876 ops/sec ±0.61% (86 runs sampled)
rxjs x 547,732 ops/sec ±0.66% (86 runs sampled)
kefir x 496,709 ops/sec ±5.15% (50 runs sampled)
Slowest is kefir
Как вы, ребята, можете увидеть Кефир оказался самым медленным в отличие от иска сделанный на этом link.
- Я сделал что-то неправильно при написании теста?
- Было бы здорово, если бы кто-нибудь мог объяснить разницу, почему это происходит . Особенно, когда вы сравниваете его с javascript event-emitter.
1) Эта ссылка для RxJS 4, последняя версия v5 - это то, что я думаю, что вы используете. v5 был перестроен с нуля с акцентом на производительность. 2) Вы не сравниваете одни и те же операции между библиотеками, вы добавили 'do' для RxJS и используете' scan' для Kefir. 3) Что именно вы пытаетесь оценить? Тривиальные тесты, подобные этому, на самом деле ничего не говорят о поведении библиотеки в любом значительном масштабе. – paulpdaniels
Я хотел сравнить производительность между EventEmitters и Reactive Framework. Какой из них будет более результативным. Я хотел узнать причины этих различий в производительности. Поскольку я новичок в области реактивного программирования, мне не известны все функции. Я просто использовал первое, что мог найти для суммирования значений в массиве. Было бы здорово, если бы вы могли рекомендовать лучшую методику бенчмаркинга. благодаря – pntripathi9417