전체 XML파일 내용을 1회 순회하면서 각 노드의 이름을 인덱싱하여 따로 저장하고, 직렬화된 트리 형태의 노드 구조를 가지고 있어서 읽을 때 추가 오버헤드 없이 각 데이터에 접근할 수 있습니다.
- BXmlDocument.LoadFromXml
- BXmlDocument.LoadFromXmlFile
아이디어가 생각나고 집에서 먼저 구현 시도를 해본 뒤에 회사에 먼저 적용하였고, 기억나는대로 다시 구현해보는 중입니다. 유용하게 사용될 만한 곳이 많지는 않지만, 회사 내 클라이언트의 XML 로딩 속도를 최적화하는데 사용했습니다 (속도 50% 가량 감소, 임시 메모리 할당을 최소화해 메모리 파편화 감소)
- Attribute 와 Element 만 보존하며 주석, 공백, 줄바꿈 등의 요소는 모두 제거됩니다.
- UTF-8 인코딩만 사용됩니다.
- 네임스페이스 등 고급 XML 기능은 지원하지 않습니다.
- 한번 bxml로 변환한 후에는 읽기 전용입니다.
BenchmarkDotNet v0.13.10, Windows 10 (10.0.19045.3803/22H2/2022Update)
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET SDK 7.0.400
[Host] : .NET 7.0.10 (7.0.1023.36312), X64 RyuJIT AVX2 [AttachedDebugger]
DefaultJob : .NET 7.0.10 (7.0.1023.36312), X64 RyuJIT AVX2
Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
---|---|---|---|---|---|---|---|
Benchmark_XDocument | 73.736 ms | 1.3151 ms | 1.6151 ms | 3571.4286 | 3428.5714 | 1285.7143 | 20.63 MB |
Benchmark_BXmlDocument | 3.175 ms | 0.0289 ms | 0.0242 ms | 15.6250 | 15.6250 | 15.6250 | 7.82 MB |