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 시간이 줄어들어 서버가 더 많은 동시 연결을 처리할 수 있어요. |
완전한 호환성
최적화는 완전히 투명하게 이루어져요. 애플리케이션에서 코드 변경이 필요하지 않아요. 전송되는 압축 데이터는 이전 버전과 동일하므로 업그레이드된 서버가 기존 클라이언트와 원활하게 작동하고 그 반대도 마찬가지예요.
새 구현은 모든 플랫폼과 컴파일러를 지원해요:
- Delphi 7부터 Delphi 13까지 (C++Builder 포함)
- Windows, macOS, Linux, Android, iOS
- 32비트 및 64비트 대상
2026.4.0으로 업그레이드하기
permessage-deflate 최적화는 sgcWebSockets 2026.4.0에서 사용할 수 있어요. 최신 버전으로 업데이트하기만 하면 WebSocket 연결이 자동으로 더 빠른 압축의 혜택을 받아요. esegece.com에서 다운로드하세요.
이 작업에 영감을 준 초기 최적화 구현을 기여해 주신 Michael에게 특별히 감사해요. 지속적인 zlib 컨텍스트와 직접 메모리 접근에 대한 그의 연구가 이번 성능 개선의 토대가 됐어요.
