より高速な WebSocket 圧縮

· 機能

WebSocket 圧縮は、特に JSON ペイロードのような繰り返しデータを送信する際に帯域幅を削減しレスポンスを向上させるうえで不可欠です。permessage-deflate 拡張はすべての WebSocket フレームをリアルタイムで圧縮しますが、圧縮速度がアプリケーションのスループットに直接影響します。

sgcWebSockets 2026.4.0 より、permessage-deflate の実装を完全に書き直し、大幅に高速化しました。ベンチマークでは小さなメッセージの圧縮・展開が最大 15 倍高速化され、あらゆるペイロードサイズで改善が確認されています。

何が変わったか

以前の実装では、WebSocket フレームごとに圧縮エンジンを初期化・破棄していました。わずか 1 KB のメッセージでもコンプレッサーのセットアップ・データ圧縮・終了処理のコストが毎回発生し、次のメッセージでも同じ処理を繰り返していました。

新しい実装では、圧縮エンジンをフレーム間で保持します。最初のフレーム到着時に一度だけ初期化され、接続の有効期間中再利用されます。フレームごとのセットアップオーバーヘッドが排除されるとともに、エンジンが過去のメッセージから学習するため繰り返しデータパターンの圧縮が高速化します。

持続的な圧縮コンテキストに加え、新しい実装にはいくつかの最適化が含まれています:

ベンチマーク結果

各メッセージサイズについて 10,000 回の圧縮・展開ラウンドトリップを実施しました。各ラウンドトリップで JSON ペイロードを圧縮後に展開し、出力が元と一致することを確認しています。テストは Delphi 12 Athens でコンパイルした Windows 64 ビットマシンで実施しました。

デフォルト設定(持続的コンテキスト)

これはフレーム間で圧縮コンテキストを維持するデフォルトモードで、最も一般的な実際のシナリオです:

メッセージサイズ 以前 (ms) 新 (ms) 高速化率
1 KB 437 ms 28 ms 15.6 倍高速
4 KB 480 ms 88 ms 5.5 倍高速
16 KB 546 ms 431 ms 1.3 倍高速
64 KB 1,994 ms 1,725 ms 1.2 倍高速

NoContextTakeOver 有効時(独立フレーム)

NoContextTakeOver を有効にすると各フレームが独立して圧縮されます。このモードでも、バッファ再利用と直接メモリアクセスの最適化により確実な改善が得られます:

メッセージサイズ 以前 (ms) 新 (ms) 高速化率
1 KB 149 ms 75 ms 2.0 倍高速
4 KB 173 ms 100 ms 1.7 倍高速
16 KB 302 ms 228 ms 1.3 倍高速
64 KB 1,216 ms 1,094 ms 1.1 倍高速

最も恩恵を受けるのは誰か

多数の小さなメッセージをやり取りするアプリケーション(典型的な WebSocket のユースケース)で最も大きな改善が得られます:

チャット・メッセージング
短いテキストメッセージ(通常 4 KB 未満)で最大の改善:圧縮が 5〜15 倍高速化。
リアルタイムデータフィード
ダッシュボード・株価ティッカー・IoT センサーの JSON 更新は、高速化と繰り返しパターンを学習する持続的コンテキストの両方から恩恵を受けます。
ゲーム・マルチプレイヤー
頻繁な小さな状態更新がフレームごとの低オーバーヘッドから恩恵を受けます。
高同時接続サーバー
フレームごとの CPU 時間が減ることで、より多くの同時接続を処理できます。

完全互換

この最適化は完全に透明です。アプリケーションのコード変更は不要です。ネットワーク上の圧縮データは以前のバージョンと同一であるため、アップグレード済みサーバーは既存クライアントとシームレスに動作し、その逆も同様です。

新しい実装はすべてのプラットフォームとコンパイラーをサポートしています:

2026.4.0 へのアップグレード

permessage-deflate の最適化は sgcWebSockets 2026.4.0 で利用できます。最新バージョンに更新するだけで WebSocket 接続が自動的に高速圧縮の恩恵を受けます。esegece.com からダウンロードできます。

この取り組みのきっかけとなった最初の最適化実装を提供してくださった Michael 氏に深く感謝します。持続的 zlib コンテキストと直接メモリアクセスに関する彼の研究がこれらのパフォーマンス改善の基盤となりました。