Daha Hızlı WebSocket Sıkıştırması

· Özellikler

WebSocket sıkıştırması, özellikle JSON yükleri gibi tekrarlayan verileri iletirken bant genişliğini azaltmak ve yanıt verme hızını artırmak için temel öneme sahiptir. permessage-deflate uzantısı her WebSocket çerçevesini anında sıkıştırır, ancak bu sıkıştırmanın hızı uygulamanızın aktarım hızını doğrudan etkiler.

sgcWebSockets 2026.4.0 sürümünden itibaren, permessage-deflate uygulaması önemli ölçüde daha hızlı performans için tamamen yeniden yazılmıştır. Kıyaslamalarımızda, küçük mesajlar 15 kata kadar daha hızlı sıkıştırılır ve açılır; tüm yük boyutlarında ölçülebilir kazanımlar elde edilir.

Neler Değişti?

Önceki uygulama, sıkıştırma motorunu her bir WebSocket çerçevesinde başlatıp yok ediyordu. Bu, küçük bir 1 KB'lık mesajın bile sıkıştırıcıyı kurmanın, verileri sıkıştırmanın ve ardından her şeyi sökmenin tüm maliyetini ödediği ve sonraki mesaj için tüm sürecin tekrarlandığı anlamına geliyordu.

Yeni uygulama, sıkıştırma motorunu çerçeveler arasında canlı tutar. İlk çerçeve geldiğinde bir kez başlatılır ve bağlantının ömrü boyunca yeniden kullanılır. Bu, çerçeve başına kurulum yükünü ortadan kaldırır ve ayrıca motorun önceki mesajlardan öğrenmesine olanak tanıyarak tekrarlayan veri kalıplarının daha hızlı sıkıştırılmasını sağlar.

Kalıcı sıkıştırma bağlamına ek olarak, yeni uygulama birkaç başka optimizasyon daha içerir:

Kıyaslama Sonuçları

Her mesaj boyutu için 10.000 sıkıştırma + açma turu çalıştırdık. Her tur, bir JSON yükünü sıkıştırır ve ardından çıktının orijinalle eşleştiğini doğrulayarak geri açar. Test, Delphi 12 Athens ile derlenmiş bir Windows 64-bit makinede gerçekleştirildi.

Varsayılan Yapılandırma (kalıcı bağlam)

Bu, sıkıştırma bağlamının çerçeveler arasında korunduğu varsayılan moddur; en yaygın gerçek dünya senaryosudur:

Mesaj Boyutu Önceki (ms) Yeni (ms) Hızlanma
1 KB 437 ms 28 ms 15,6 kat daha hızlı
4 KB 480 ms 88 ms 5,5 kat daha hızlı
16 KB 546 ms 431 ms 1,3 kat daha hızlı
64 KB 1,994 ms 1,725 ms 1,2 kat daha hızlı

NoContextTakeOver ile (bağımsız çerçeveler)

NoContextTakeOver etkinleştirildiğinde, her çerçeve bağımsız olarak sıkıştırılır. Bu modda bile, arabellek yeniden kullanımı ve doğrudan bellek erişimi optimizasyonları sağlam bir iyileştirme sağlar:

Mesaj Boyutu Önceki (ms) Yeni (ms) Hızlanma
1 KB 149 ms 75 ms 2,0 kat daha hızlı
4 KB 173 ms 100 ms 1,7 kat daha hızlı
16 KB 302 ms 228 ms 1,3 kat daha hızlı
64 KB 1,216 ms 1,094 ms 1,1 kat daha hızlı

En Çok Kim Yararlanır?

İyileştirme, çok sayıda küçük mesaj alışverişi yapan uygulamalar için en çarpıcı olanıdır; bu da tam olarak tipik WebSocket kullanım senaryosudur:

Sohbet & Mesajlaşma
Kısa metin mesajları (genellikle 4 KB altında) en büyük kazanımları görür: 5–15 kat daha hızlı sıkıştırma.
Gerçek Zamanlı Veri Akışları
Gösterge panoları, borsa kayanyazıları ve IoT sensörleri için JSON güncellemeleri hem hızdan hem de tekrarlayan kalıpları öğrenen kalıcı bağlamdan yararlanır.
Oyun & Çok Oyunculu
Sık küçük durum güncellemeleri, düşük çerçeve başına yükten yararlanır.
Yüksek Eşzamanlılıklı Sunucular
Çerçeve başına daha az CPU süresi, sunucunun daha fazla eşzamanlı bağlantıyı işleyebileceği anlamına gelir.

Tam Uyumlu

Optimizasyon tamamen şeffaftır; uygulamanızda herhangi bir kod değişikliği gerekmez. Hat üzerindeki sıkıştırılmış veriler önceki sürümle aynıdır; bu nedenle yükseltilmiş sunucular mevcut istemcilerle sorunsuz çalışır ve tersi de geçerlidir.

Yeni uygulama tüm platformları ve derleyicileri destekler:

2026.4.0 Sürümüne Yükseltin

permessage-deflate optimizasyonu sgcWebSockets 2026.4.0 sürümünde mevcuttur. En son sürüme güncellemeniz yeterlidir; WebSocket bağlantılarınız otomatik olarak daha hızlı sıkıştırmadan yararlanacaktır. esegece.com adresinden indirin.

Bu çalışmaya ilham veren ilk optimize edilmiş uygulamaya katkıda bulunduğu için Michael'a özel teşekkürler. Kalıcı zlib bağlamları ve doğrudan bellek erişimi üzerine yaptığı araştırma, bu performans iyileştirmelerinin temelini attı.