Charles KWON OhJun
b72623f79c
perf: CDX binary search + leaf cache hit + DBF/NTX zero-copy
CDX Seek (cdx.go — ported from rddfive/cdx_engine.c):
- Linear search → binary search on decoded leaf keys (O(N) → O(log N))
- Leftmost match: continues searching left after match (duplicate key correctness)
- Leaf cache hit: skip decode if same page (SEEK loop optimization)
NTX zero-copy Page (ntx.go — BoltDB pattern):
- Page.data: []byte slice into mmap (was [1024]byte copy)
- cachedLoadPage: p.data = mmap[offset:offset+1024] (no memcpy!)
- pagePool: 8-slot ring for Page struct reuse
DBF mmap (dbf.go):
- GoTo: copy from mmap instead of file.ReadAt syscall
- Unmap before Append/Close/Flush (file growth), re-mmap after
Results (50K, ext4, Harbour comparison):
┌──────────────┬──────────┬──────────┬──────────────┐
│ │ Harbour │ Five │ │
├──────────────┼──────────┼──────────┼──────────────┤
│ CDX SEEK │ 27ms │ 49ms │ 1.8x (was 6.5x!)│
│ CDX SEEK ID │ 17ms │ 24ms │ 1.4x (was 8.4x!)│
│ CDX SCAN │ 5ms │ 4ms │ ✅ FASTER │
│ CDX SCOPE │ 4ms │ 3ms │ ✅ FASTER │
│ NTX SCAN │ 4ms │ 3ms │ ✅ FASTER │
│ NTX DELSCAN │ 12ms │ 3ms │ ✅ 4x FASTER │
│ NTX SEEK rnd │ 67ms │ 69ms │ ≈ equal │
└──────────────┴──────────┴──────────┴──────────────┘
82/82 stress PASS. CDX 18/18 cross-read PASS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>