当事件以类似动画的速度发生时(例如每秒至少20次),任何人都有RxJS表现的任何数字/资源?我想重构一个javascript模拟器(它每秒至少执行20次模拟步骤)到使用事件和监听器,我想知道使用RxJS作为事件队列/监听器解决方案是否可行(所以我不喜欢不得不写我自己的)。
我也很好奇它是如何扩展的,当你有一百个东西在一个observable上听,让我知道如何构建视图更新(我是否应该只保留一些听众并保留一个地图只需让每个元素都注册一个监听器就需要更新或保持简单的视图元素集。)
谷歌搜索得到了我:Is RxJS faster than imperative?
并且结果有点令人担忧(比普通代码慢10倍,但对于具有1个侦听器的系统,每个事件只需要额外的.005ms)。我也会进行自己的实验,但任何可以在具有大量听众的真实项目中使用RxJS的人的可伸缩性信息(不仅仅是性能,还有其他内容,如簿记和垃圾收集)都非常有用。
答案 0 :(得分:0)
我在RxJS 5上进行了一些初步实验,结果如下:
基准代码:
var eventQueue: number[];
var initEventQueue = function () {
const INIT_MAX = 10000;
eventQueue = new Array<number>(INIT_MAX);
for (let i = 0; i < INIT_MAX; i++) {
eventQueue[i] = i;
}
}
export var testObservables = function () {
let observable = Rx.Observable;
initEventQueue();
for (let OBSERVERS = 1; OBSERVERS <=20; OBSERVERS++) {
let timerName = `Rx_${OBSERVERS}x_observer`;
console.time(timerName);
let eventQueueObservable = observable.from(eventQueue)
.map(function (x: number) { return x; });
for (let ctr = 0; ctr < OBSERVERS; ctr++) {
eventQueueObservable
.subscribe(function (x: number) {
let y= x * ctr;
return y;
});
}
console.timeEnd(timerName);
}
}
输出:
Rx_1x_observer: 7.261962890625ms
Rx_2x_observer: 9.14794921875ms
Rx_3x_observer: 2.1669921875ms
Rx_4x_observer: 1.617919921875ms
Rx_5x_observer: 1.93310546875ms
Rx_6x_observer: 3.100830078125ms
Rx_7x_observer: 3.074951171875ms
Rx_8x_observer: 2.90673828125ms
Rx_9x_observer: 5.216796875ms
Rx_10x_observer: 4.488037109375ms
Rx_11x_observer: 5.946044921875ms
Rx_12x_observer: 4.888916015625ms
Rx_13x_observer: 5.302978515625ms
Rx_14x_observer: 5.02197265625ms
Rx_15x_observer: 7.6201171875ms
Rx_16x_observer: 7.156005859375ms
Rx_17x_observer: 6.6640625ms
Rx_18x_observer: 8.875ms
Rx_19x_observer: 9.205078125ms
Rx_20x_observer: 9.756103515625ms
前几个结果的高数字很可能是JIT优化尚未开始的结果,后者的结果更可能表明实际表现。如果数字正确,则每个事件*订阅者的开销远低于0.01ms,这对于动画时间更新来说已经足够了(至少只要您保持订户代码简单)。
不幸的是,我还发现订阅者必须明确取消订阅才能避免垃圾收集问题,而这不适用于我的目标架构。我可能会使用弱映射来使用标准的侦听器模式。