11

WebSocketで頻繁に(フレームごとに少なくとも1回)バイナリメッセージを受信し、canvas/webglを使用してデータをプロットするアプリケーションがあります。私はかなり良い鋸歯の記憶プロファイルを持っていることに気づいた。短いデータがたくさん集まっています。 enter image description hereWebSocket頻繁にメッセージをゼロコピーする

私はonmessageからオブジェクトを受けていますので、これは少なくとも一度描画した後、デ・参照するために使用されているすべての16msの、私は驚かれていません。

私の質問です:これを避ける/最小限にするためのヒントはありますか? WebSocket APIに基づいて、ソケット受信呼び出しごとに新しいメモリを割り当てる代わりになるようなことはありません。別の言語/環境では、メモリをあらかじめ割り当てておき、そのバッファに受信して、短命のオブジェクトのメモリを常に割り当てないようにしていましたが、ブラウザのJavaScriptでこれを実現する方法は考えられません。

参考までに、私のフレームビューです。

enter image description here

そのアイドル時間がガベージコレクションであるかどうかはわからないのですか?任意のdev - toolsの忍者の洞察力は非常に高く評価されるだろう。私はあなたの問題を理解していますが、他の言語でのようにグローバル配列を宣言し、例えば、循環バッファとして使用することができます

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_ManagementでJSでのメモリ割り当てに関する詳細な情報を見つけることができます

var newJSON = JSON.parse(JSON.stringify(msg)); 

?何かを始めた?フィドル? – Anonymous0day

+1

WebSocket上のラズベリーパイからセンサーの日付をストリーミングするのと同じ問題があります。私は恐れがあり、javascriptでWebSocketのメモリ割り当てを妨害する方法はありません。私の研究は結果をもたらさなかった。 – windm

+0

あなたは何を達成したいですか?プログラムの実行期間と一貫性があり、長寿命のパフォーマンスがどれほど重要ですか?少しのコードやコードサンプルを見るのは大変です –

答えて

1

わからない場合:

var buffer = []; 
var bufferLength = 1000; 
var start = 0; 
var end = 0; 
var content = 0; 

socket.onmessage(function(msg) { //msg allocated 
    end %= bufferLength; 
    if (end == start && content != 0) 
     console.log("Buffer is full"); 
    else { 
     content++; 
     buffer[end++] = msg; //reference to msg saved so it's not destroyed at the end of the callback 
    } 
}); 

function getNext() { 
    start %= bufferLength; 
    if (start == end && content == 0) 
     console.log("Buffer is empty"); 
    else { 
     content--; 
     return buffer[start++]; // returns reference to next msg 
    } 
} 

編集:私はより多くのことを答えを修正しました

JSは、受信したメッセージのメモリをWebソケットに割り当て、onmessageのために定義されたコールバックでパラメータとして与えられるmsgという参照を作成します。

注意JS GCは、コード内で参照されていないときにのみ、そのメモリを破壊します。

私はバッファ内にその参照を保存するので、コールバックが完了したときに値が破棄されず、後でgetNextを使用してアクセスできます。 JSはあなたのためにそれをしたので、新しいメモリを割り当てる必要はありません。

msgの別のコピーを複製または作成する場合は、いくつかのオプションがあります。あなたは非円形JSONオブジェクトは次のようになりクローンを作成することができます簡単なオプション:あなたはあなたが任意のコードサンプルを持っている

+0

それは私の質問に答えるものではありません。 msgstr "ソケット受信時に割り当てられた新しいメモリ" msgid。 – sethro

+0

私は 'onmessage'に渡されたオブジェクトに割り当てられたメモリに特に関心があります:' msg'。私はあなたが私の質問を誤解していると思います。 WebSocketや他のAPIが基底のソケットから受け取るために使用するバッファを事前に割り当てる方法を求めています。 – sethro

+1

さて、あなたの問題を今理解しています。私はあなたがJSを使ってそれについて何かできることはないと思います。 chrome:// flags /#enable-zero-copyのzero-copyラスタライザを有効にすると、Webglでより速くレンダリングできるようになります。また、あなたの問題はメモリアクセスに関するものであり、サーバーから送信されたパケットの数/サイズで遊ぶことができます。より小さい/大きいパケットは操作の数を減らします。 –

関連する問題