私はここにRxJS 5と上のいくつかの予備実験では、結果は実行しました:
- セットアップ:10000長イベント配列
- 加入者数:1
- 20への出力形式:Rx_ {n} x_observer:サブスクライブを処理する合計時間はnです。
ベンチマークコード:
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);
}
}
出力:最初の数の結果に高い数字が最も可能性が高いまだで蹴るないJITの最適化の結果である
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
、後者の結果はもっとあります実際のパフォーマンスを示す可能性があります。数字が正しい場合、オーバヘッドはイベント*のサブスクライバごとに0.01ミリ秒以下です(少なくとも、サブスクライバコードを単純にしておけば、アニメーション時間の更新には十分です)。
残念ながら、ガーベジコレクションの問題を避けるためにサブスクライバを明示的に登録解除する必要があることもわかりました。これは私が目指しているアーキテクチャでは機能しません。おそらく、代わりに弱いマップを使って標準的なリスナー・パターンを使うでしょう。