我想比较JS EventEmitter和RxJS的性能。我写了下面的基准脚本来做到这一点:EventEmitter vs RxJS vs Kefir
性能测试
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)你没有比较库之间的相同操作,你为RxJS添加了'do',并且正在使用'scan'来开发Kefir。 3)你究竟在想什么?像这样的微不足道的基准测试并没有真正告诉你任何关于库的行为的任何可观的规模。 – paulpdaniels
我想比较EventEmitters和Reactive Programming Frameworks之间的性能。哪一个会更高效。我想知道这些性能差异背后的原因。由于我是反应式编程的新手,我不知道所有的功能。我只是用我能找到的第一件事来总结数组中的值。如果你能推荐更好的基准测试技术,那将是非常好的。谢谢 – pntripathi9417