2017-08-18 16 views
0

アニメーションのような速度でイベントが発生した場合(たとえば、少なくとも20回/秒)、誰でも数字/リソースをRxJSに持っていますか?私は、イベントとリスナーを使用して、私はそれがRxJSをイベントキュー/リスナーのソリューションとして使用することが可能かどうかを知りたいと思う(私は少なくとも20回シミュレーションステップを実行するjavascriptのシミュレータをリファクタリングするつもりだ(私はドン私は自分自身を書く必要はありません)。アニメーション速度でのRxJSパフォーマンス番号

また、ビューの更新を構造化する方法のアイデアを得るために、観測可能なものを聞いているものが100個もあるときは、スケールがどのようになるのか不思議です(リスナーをいくつか保持して、各要素にリスナーを登録させるだけで、更新が必要な一連のビュー要素を簡単に保つことができます)。

Googleは検索が私にこの得た:

Is RxJS faster than imperative?

をし、その結果を(10倍地味コードよりも遅いが、それでも1人のリスナーを持つシステムのためのイベントごとにだけ追加.005ms)に関するビットです。私自身の実験も行っていましたが、かなりの数のリスナーを持つ実際のプロジェクトでRxJSを使用した人からのスケーラビリティ情報(パフォーマンスだけでなく、簿記やガベージコレクションなど)も非常に便利です。

答えて

0

私はここに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ミリ秒以下です(少なくとも、サブスクライバコードを単純にしておけば、アニメーション時間の更新には十分です)。

残念ながら、ガーベジコレクションの問題を避けるためにサブスクライバを明示的に登録解除する必要があることもわかりました。これは私が目指しているアーキテクチャでは機能しません。おそらく、代わりに弱いマップを使って標準的なリスナー・パターンを使うでしょう。

関連する問題