Firefox で標準 ML (SML) をクライアント側プログラミング言語として使用できるようにする Firefox 拡張機能を作成しています。仕組みは次のとおりです。
- 拡張機能は、PolyML プロセス (最上位の対話型シェルを備えた SML コンパイラ) を起動します。
- 次に、拡張機能と PolyML プロセスの間でソケット通信が確立されます。
- SML コードは Web ページから読み取られ、評価のためにソケット経由で PolyML プロセスに送信されます。
- そのコードは、DOM を操作するために、私が提供するライブラリを使用する場合があります。
DOM ライブラリの実装方法は次のとおりです。
- 誰かが SML 関数 DOM.getElementById を実行するとします。
- このリクエストはソケット経由で拡張機能に転送され、そこで拡張機能はページ上で JavaScript 関数 getElementById を実行し、結果をソケット経由で PolyML プロセスに送り返します。
私の質問は、理論的には、ソケット通信に関しては、パフォーマンスの面でどのような制限があると予想する必要があるかということです。
非常に大まかなプロファイリングを行ったところ、拡張機能と PolyML の間でこのインターフェイスを使用すると、約2500 メッセージ/秒、平均サイズ70 バイト/メッセージを送信できるようです。
これをより具体的に説明すると、Canvas 要素を使用してブラウザーでいくつかのアニメーションを描画したいとします。20 fps を達成したい場合は、すべてのフレームを 0.05 秒で描画する必要があることを意味します。つまり、フレームごとに約 125 のメッセージしか送信できません。これらのメッセージは、JavaScript 関数呼び出しに対応しています。たとえば、以下のコードはパスを描画し、ソケット通信の 9 つのメッセージに対応する 9 つの JavaScript 関数呼び出しを行っています。
val _ = Canvas.beginPath context; val _ = Canvas.setFillStyle context fillColor; val _ = Canvas.setStrokeStyle context fillColor; val _ = Canvas.setLineWidth context size; val _ = Canvas.moveTo context posx posy; val _ = Canvas.lineTo context posx_new posy_new; val _ = Canvas.stroke context; val _ = Canvas.arc context posx_new posy_new (size/2.0) 0.0 6.28 true; val _ = Canvas.fill context;
JavaScript は、明らかにパフォーマンスがはるかに優れています。フレームを描画するために、この 0.05 秒で数千 (数百) 回の Canvas/DOM 関数呼び出しを行うことができると思います。
それで、私の質問は、ソケット通信を使用して非常に高速なメッセージ交換を行った経験があるかということです。毎秒 2500 個の小さなメッセージ (この場合、毎秒 150 キロバイトに相当) が正しいように見えるのか、それとも非常に間違ったことをしている可能性があるのかを知りたいです。
たとえば、Firefox でのソケットの実装 (特に、JavaScript インターフェースhttps://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket経由での使用) は、この種の迅速な対話にはあまり適していないのではないかという疑いがあります。たとえば、ソケットからの読み取りは、イベント ループ メカニズムを介して行われます。つまり、私は Firefox に依存しています。着信ソケット メッセージの可用性について通知するため、メッセージの送信と受信の間に大きな遅延 (250 ミリ秒など) が発生することがあります (ただし、これは、Firefox が忙しくしているときにのみ発生するようです)。他のこと、そして私はソケット通信の..理論上の..制限にもっと興味があります)
アイデア、考え、欠陥はありますか? JavaScript や C への外部関数インターフェイス (JavaScript と PolyML の両方) からではなく、C++ XPCOM コンポーネントから私の通信を実装するパイプなど、他の IPC メカニズムを使用する方が良いと思いますか?
(興味のある方は、プロジェクトはhttps://assembla.com/wiki/show/polymlextにあります)