Skip to content

Latest commit

Β 

History

History
421 lines (352 loc) Β· 19.9 KB

File metadata and controls

421 lines (352 loc) Β· 19.9 KB

Architecture Overview

System Design

This library provides multiple JSON streaming parser implementations, each optimized for different use cases:

  1. JSONParser (TypeScript Transform Stream) - For Node.js streams
  2. Native Parser (C++ Background Thread) - For file descriptors
  3. Worker Parser (JavaScript Worker Thread) - Pure JS alternative

Data Flow Architectures

JSONParser (Stream-Based)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Node.js Stream (TCP, stdin, pipe, etc.)                β”‚
β”‚                                                         β”‚
β”‚  Data: "{\"foo\":1}\n{\"bar\":2}\n"                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β”‚ .pipe()
                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ JSONParser (Transform Stream)                           β”‚
β”‚                                                         β”‚
β”‚  _transform(chunk, encoding, cb) {                      β”‚
β”‚    // Split by delimiter                                β”‚
β”‚    // Parse each JSON string                            β”‚
β”‚    // Push parsed objects                               β”‚
β”‚  }                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β”‚ .on('data')
                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ JavaScript Event Loop                                   β”‚
β”‚                                                         β”‚
β”‚  parser.on('data', (obj) => {                           β”‚
β”‚    // Process parsed object                             β”‚
β”‚  });                                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Characteristics:
- βœ… Works with any Node.js stream
- βœ… Simple, pure JavaScript
- βœ… Fast when main thread is idle
- ❌ Blocks main thread during parsing
- ❌ Performance degrades under load

Native Parser (Direct FD Access)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Node.js Main Thread                                     β”‚
β”‚                                                         β”‚
β”‚  const fd = fs.openSync('/path/to/file', 'r');         β”‚
β”‚  const parser = createJsonParserNativeFromFd(fd);      β”‚
β”‚                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Native Addon (N-API)                           β”‚   β”‚
β”‚  β”‚                                                 β”‚   β”‚
β”‚  β”‚  1. Receives fd from JS                        β”‚   β”‚
β”‚  β”‚  2. Duplicates: fd_dup = dup(fd)               β”‚   β”‚
β”‚  β”‚  3. Starts C++ background thread               β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                          β”‚                              β”‚
β”‚                          β”‚ fd_dup                       β”‚
β”‚                          β–Ό                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ Direct syscall
                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ C++ Background Thread (std::thread)                    β”‚
β”‚                                                         β”‚
β”‚  while (!stop) {                                        β”‚
β”‚    // Direct read from kernel                           β”‚
β”‚    ssize_t n = read(fd_dup, buf, BUF_SZ);              β”‚
β”‚                                                         β”‚
β”‚    // Process data in C++                               β”‚
β”‚    // Split by delimiter                                β”‚
β”‚    // Prepare batches                                   β”‚
β”‚                                                         β”‚
β”‚    // Send to main thread via TSFN                      β”‚
β”‚    napi_call_threadsafe_function(tsfn, batch);         β”‚
β”‚  }                                                      β”‚
β”‚                                                         β”‚
β”‚  Data path: Kernel β†’ C++ buffer β†’ Zero-copy β†’ JS       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β”‚ Thread-Safe Function (TSFN)
                     β”‚ Zero-copy external buffers
                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Node.js Main Thread (TSFN Callback)                    β”‚
β”‚                                                         β”‚
β”‚  call_js_from_tsfn_with_instance(env, cb, ctx, data) { β”‚
β”‚    // Receive batch from C++ thread                     β”‚
β”‚    // If passRawBuffers: true                          β”‚
β”‚    //   - Buffers are zero-copy (external buffers)     β”‚
β”‚    //   - Parse with V8's JSON.parse()                  β”‚
β”‚    // If passRawBuffers: false                          β”‚
β”‚    //   - Convert C++ JValue to JS objects             β”‚
β”‚    // Emit 'data' events                                β”‚
β”‚  }                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β”‚ .on('data')
                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Application Code                                        β”‚
β”‚                                                         β”‚
β”‚  parser.on('data', (obj) => {                           β”‚
β”‚    // Process parsed object                             β”‚
β”‚  });                                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Characteristics:
- βœ… Direct kernel access (no Node.js stream layer)
- βœ… Background I/O thread (doesn't block main thread)
- βœ… Zero-copy buffers (efficient data transfer)
- βœ… Resilient under load (only 1.5x slower at 90% CPU)
- βœ… Works with file descriptors (files, stdin, sockets)
- ❌ Requires native addon build
- ❌ Only works with file descriptors (not all streams)

Worker Parser (JavaScript Worker Thread)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Node.js Main Thread                                     β”‚
β”‚                                                         β”‚
β”‚  const fd = fs.openSync('/path/to/file', 'r');         β”‚
β”‚  const parser = createJsonParserWorkerFromFd(fd);      β”‚
β”‚                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Worker Thread Manager                           β”‚   β”‚
β”‚  β”‚                                                 β”‚   β”‚
β”‚  β”‚  1. Spawns worker thread                        β”‚   β”‚
β”‚  β”‚  2. Passes fd to worker                         β”‚   β”‚
β”‚  β”‚  3. Sets up postMessage handlers                β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                          β”‚                              β”‚
β”‚                          β”‚ fd                           β”‚
β”‚                          β–Ό                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚
                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Worker Thread (Separate V8 Isolate)                    β”‚
β”‚                                                         β”‚
β”‚  // json-parser-worker-thread.ts                       β”‚
β”‚  while (true) {                                         β”‚
β”‚    // Read from fd using fs.readSync()                  β”‚
β”‚    const n = fs.readSync(fd, buf, {...});              β”‚
β”‚                                                         β”‚
β”‚    // Split by delimiter                                β”‚
β”‚    // Parse JSON in worker thread                       β”‚
β”‚    const parsed = JSON.parse(candidate);                β”‚
β”‚                                                         β”‚
β”‚    // Add to batch (complete POJSOs)                    β”‚
β”‚    batch.push(parsed);                                  β”‚
β”‚                                                         β”‚
β”‚    // Send to main thread via postMessage               β”‚
β”‚    parentPort!.postMessage({                            β”‚
β”‚      type: 'data',                                      β”‚
β”‚      batch: batch  // Structured cloning                β”‚
β”‚    });                                                  β”‚
β”‚  }                                                      β”‚
β”‚                                                         β”‚
β”‚  Data path: Kernel β†’ Worker β†’ Structured Clone β†’ Main  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β”‚ postMessage() (structured cloning)
                     β”‚ Full object graph serialization
                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Node.js Main Thread (Message Handler)                  β”‚
β”‚                                                         β”‚
β”‚  worker.on('message', (msg) => {                        β”‚
β”‚    if (msg.type === 'data') {                           β”‚
β”‚      // Objects arrive fully parsed                     β”‚
β”‚      // Structured cloning reconstructs object graph   β”‚
β”‚      this.pending.push(...msg.batch);                   β”‚
β”‚      // Emit 'data' events                              β”‚
β”‚    }                                                    β”‚
β”‚  });                                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β”‚ .on('data')
                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Application Code                                        β”‚
β”‚                                                         β”‚
β”‚  parser.on('data', (obj) => {                           β”‚
β”‚    // Process parsed object                             β”‚
β”‚  });                                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Characteristics:
- βœ… Pure JavaScript (no native addon)
- βœ… Parsing offloaded to worker thread
- βœ… Complete objects arrive (no re-parsing needed)
- ❌ Structured cloning overhead (serialization/deserialization)
- ❌ Slower than native parser (especially for nested objects)
- ❌ More memory overhead (object graph copying)

Threading Models

Native Parser Threading

Main Thread (Node.js)          Background Thread (C++)
─────────────────────          ────────────────────────
                               
Create parser                  ──┐
  β”‚                              β”‚
  β”œβ”€> dup(fd)                    β”‚
  β”œβ”€> Start std::thread          β”‚
  β”‚                              β”‚
  β”‚                              β”œβ”€> read(fd_dup, buf)
  β”‚                              β”œβ”€> Process data
  β”‚                              β”œβ”€> Prepare batch
  β”‚                              β”‚
  β”‚<── TSFN callback β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  β”‚   (zero-copy buffers)
  β”‚
  β”œβ”€> JSON.parse() (if passRawBuffers)
  β”œβ”€> Emit 'data' events
  β”‚
  └─> Application receives objects

Worker Parser Threading

Main Thread (Node.js)          Worker Thread (V8 Isolate)
─────────────────────          ───────────────────────────
                               
Create parser                  ──┐
  β”‚                              β”‚
  β”œβ”€> Spawn worker_threads       β”‚
  β”‚                              β”‚
  β”‚                              β”œβ”€> fs.readSync(fd, buf)
  β”‚                              β”œβ”€> JSON.parse()
  β”‚                              β”œβ”€> Create POJSOs
  β”‚                              β”‚
  β”‚<── postMessage() β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  β”‚   (structured cloning)
  β”‚
  β”œβ”€> Receive objects (already parsed)
  β”œβ”€> Emit 'data' events
  β”‚
  └─> Application receives objects

Performance Characteristics

Idle Main Thread

Parser Time (5K objects) Throughput Notes
JSONParser ~16ms 312,500 obj/sec Fastest - no thread overhead
Native-optimized ~21ms 238,000 obj/sec Thread overhead, but zero-copy
Worker ~31ms 161,000 obj/sec Structured cloning overhead

Under Load (50% CPU)

Parser Slowdown Notes
JSONParser ~2-3x Main thread blocked by parsing
Native-optimized ~1.37x Background I/O helps
Worker ~1.2-1.5x Parsing offloaded to worker

Under Load (90% CPU)

Parser Slowdown Notes
JSONParser ~4-5x Severe degradation
Native-optimized ~1.51x Resilient under load
Worker ~1.3-1.8x Good but structured cloning overhead

Memory Management

Native Parser (Zero-Copy)

// C++ side: Allocate buffer
item.external_data = std::make_unique<uint8_t[]>(size);
std::memcpy(item.external_data.get(), data, size);

// Create external buffer (zero-copy)
napi_create_external_buffer(env, size, item.external_data.get(),
                            nullptr, nullptr, &buffer);

// Buffer lifetime:
// - Owned by unique_ptr in ParsedItem
// - ParsedItem lives in BatchMsg
// - BatchMsg deleted after JS callback processes it
// - Safe: TSFN callbacks execute synchronously

Worker Parser (Structured Cloning)

// Worker thread: Create object
const parsed = JSON.parse(json);  // POJSO created

// Main thread: Receive via structured cloning
// - Entire object graph is serialized
// - Transferred across thread boundary
// - Deserialized on main thread
// - New objects created (memory copied)

Key Design Decisions

Why Zero-Copy Buffers?

  • Performance: Eliminates memory copying overhead
  • Efficiency: V8's JSON.parse() is highly optimized
  • Scalability: Better for high-throughput scenarios

Why Background Thread for I/O?

  • Non-blocking: Main thread stays responsive
  • Throughput: Can read large buffers efficiently
  • Resilience: Performance maintained under load

Why TSFN Instead of postMessage?

  • Efficiency: No serialization overhead
  • Zero-copy: Direct memory transfer
  • Lower latency: Synchronous callbacks

Why Support Both passRawBuffers Modes?

  • passRawBuffers: true (default): Best performance, uses V8's optimized JSON.parse()
  • passRawBuffers: false: Useful for debugging, C++ JSON parsing for comparison

File Descriptor Handling

Duplication Strategy

// Duplicate fd so we can:
// 1. Close it independently to break blocking read
// 2. Read from background thread safely
inst->fd_dup = dup(inst->fd);

// Background thread uses fd_dup
read(inst->fd_dup, buf, size);

// Main thread can close original fd
// Background thread continues with fd_dup

Error Handling

// Handle non-blocking FDs gracefully
if (errno == EAGAIN || errno == EWOULDBLOCK) {
  std::this_thread::sleep_for(std::chrono::milliseconds(1));
  continue;
}

// Handle interrupts
if (errno == EINTR) {
  continue;
}

Batch Processing

Why Batching?

  • Reduced overhead: Fewer callbacks = better performance
  • Better throughput: Process multiple items at once
  • Lower latency: Amortize callback cost

Batch Size Tuning

  • Small batches (64-128): Lower latency, more callbacks
  • Large batches (2048+): Better throughput, higher latency
  • Default (2048): Good balance for most use cases

Where JSON Parsing Happens

Important: The location of JSON parsing depends on the mode:

passRawBuffers: true (Default - Optimized)

  • JSON Parsing: JS main thread using V8's JSON.parse()
  • I/O: C++ background thread
  • Why: V8's JSON.parse() is highly optimized, even on main thread

passRawBuffers: false (C++ Parsing)

  • JSON Parsing: C++ background thread using C++ JSON parser
  • I/O: C++ background thread
  • Why: Useful for debugging, but slower than V8's parser

See JSON Parsing Location for detailed explanation.

Summary

The architecture is designed to:

  1. Minimize data copying - Zero-copy buffers where possible
  2. Offload I/O - Background threads for file operations
  3. Maintain responsiveness - Non-blocking main thread
  4. Scale under load - Resilient performance characteristics
  5. Support multiple use cases - Streams, FDs, different performance needs

Each parser implementation is optimized for its specific use case, providing the best performance characteristics for different scenarios.