私はwebsocketを持っていますが、現在は毎秒約45でメッセージをストリーミングしています。このレベルでは完全にクロムを殺します。ブラウザウィンドウのすべての機能がロックされます。websocketのパフォーマンスに関する問題 - すべてのメッセージがトリガされる角度変化の検出
私はこの問題の根本的な原因を見つけようとしましたが、私がこれらのメッセージをどのように処理しているか、またはAngularで検出/更新を変更していると思われました。
しかし、今、私は私が得ることができる最も簡単なのWebSocketの実装に残されています:
this.socket = new WebSocket('ws://localhost:5000/ws');
let i = 0;
this.socket.onmessage = (e: MessageEvent) => {
i++;
if (i % 100 === 0) {
console.log('recieved' + i);
}
};
これは角度注射であるが、それは何と相互作用していないです。
100個のメッセージごとにコンソールに書き込みます。これはまだ100%のCPU使用率でブラウザを殺しますが、メッセージストリームを停止するまではほとんどの時間はコンソールに出力されません。その後、すべてがキャッチアップされ、数行の「受信したx00」メッセージが送信されます。
メッセージ自体はJSONであり、次のようになります。
{
"Topic":"2a736d15-a2fe-43b2-8e8b-ee888f15a53a","Type":1,
"Message": {
"Value":2,
"Timestamp":"2017-06-05T14:46:21.615062+01:00"
}
}
は、彼らは典型的には約126文字です。
私はWebSocketを数十秒あたりのメッセージ数千のを扱うことができると仮定のだが、私はGoogleの上の任意の賢明な指標を見つけることができない、不合理なパフォーマンスのようなこのサウンドしていますか?
また、CPUプロファイラもチェックしました。 everthingのがロックアウトされた場合、それだけで通話の大きな壁だので、私は二つのメッセージにそれを断っ:(!一つ一つのメッセージのために起こります)これらのスパイクのいずれかにドリルダウン
私はこれらのいずれかの場所にブレークポイントを投げ、のWebSocketがトリガされますたび角度が何かをやっているように見える、それはゾーンとは何か(私はゼロの経験を持っている何か!)です:
スタックの最初のものは、ZoneTask.invokeです。 WebSocketを自身が、その後NgZoneがトリガされます、そして最終的には非常に高価な変更/更新のチェーンが呼び出される:
どのようにこのすべてが起こっされるだろうか? websocketに加入している7行のコードは、Angularの変更検出権とは完全に独立していますか?彼らは、どのコンポーネントにもバインドされている値を変更していません。彼らの唯一のリンクは、彼らは、すぐに私は答えをうまく質問を投稿すると、@Injectable()
ルックと研究使っWebWorkers/ServiceWorkers:https://stackoverflow.com/questions/17998011/html5-websocket-within-webworker – ppovoski