피드로 돌아가기
Dev.toBackend
원문 읽기
IAsyncEnumerable 스트리밍으로 2.5배 빠른 실행 달성함
NPoco vs UkrGuru.Sql: When Streaming Beats Buffering
AI 요약
Context
ORM 비교 시 API 설계 방식이 성능에 큰 영향을 미침. 대용량 테이블 조회 시 list 기반 buffered 방식과 streaming 방식의 차이를 BenchmarkDotNet으로 측정함.
Technical Solution
- IAsyncEnumerable: 행을 하나씩 처리하여 전체 리스트_materialization을 제거함
- UkrGuru.Sql ReadAsync(): 경량 매핑 파이프라인으로 추상화 오버헤드를 줄임
- NPoco FetchAsync(): 완전한 List를 메모리에 적재함
- Gen0/Gen1만 발생시키고 Gen2 collection을 entirely 회피함
- SqlConnection과 SqlCommand를 직접 사용하여 스트리밍 파이프라인 최적화함
Impact
UkrGuru_StreamRows가 NPoco_LoadList 대비 실행 시간 8.23ms에서 3.29ms로 60% 감소함. 메모리 할당량은 4.39MB에서 2.08MB로 53% 절감됨. Gen2 GC가 전혀 발생하지 않아 GC pressure가 현저히 낮음.
Key Takeaway
streaming과 buffering은 ORM 비교가 아니라 알고리즘 비교임. 대용량 읽기 워크로드에서 async streaming 패턴은 지연 시간과 메모리 압력 모두 개선하는 근본적으로 다른 실행 모델임.
실천 포인트
결과 집합이 큰 SQL Server 조회에서 list 적재 대신 IAsyncEnumerable<T> 스트리밍 패턴을 적용하면 실행 시간과 메모리 할당량을 동시에 크게 줄일 수 있음. ASP.NET 요청 처리, 백그라운드 워커, 메시지 컨슈머 등 실 환경에서 GC pressure 감소 효과를 기대할 수 있음.