Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
4.7 KiB
Performance Benchmarks for syntaxis-tui
This document describes the performance benchmarking infrastructure for the syntaxis-tui TUI application.
Overview
Performance benchmarks are implemented using the criterion benchmarking framework. They measure critical paths in the TUI to ensure responsiveness and smooth user experience.
Performance Targets
- Rendering: <16ms per frame (60 FPS target)
- Event Handling: <1ms for keyboard events
- State Mutations: <0.5ms for navigation, <0.1ms for flag operations
- Memory: No allocations in hot paths where possible
Benchmark Suites
1. rendering_performance
Purpose: Measure rendering latency and layout computation efficiency
Benchmarks:
- Empty projects list rendering
- Project list rendering with 5, 10, 20 projects
- Various terminal sizes (40x10, 80x24, 120x40, 200x60)
- Layout computation at different scales
Target: <16ms per complete render cycle for responsive 60 FPS
2. event_handling
Purpose: Measure event processing latency to ensure UI responsiveness
Benchmarks:
- Keyboard event creation and parsing
- Event routing and dispatch
- List navigation with wrapping
- Screen transitions (projects → detail → security)
- Dirty flag operations (set, clear, conditional checks)
Target: <1ms for event handling (allows 250ms event poll timeout in main loop)
3. state_mutations
Purpose: Measure the performance of state mutation operations
Benchmarks:
- String mutations (project name, description)
- Vector operations (create, access, resize)
- Enum variant creation
- Option operations
- Numeric mutations (index wrapping, counting)
- Combined mutations (screen transitions with state reset)
Target: <0.5ms for most operations, <0.1ms for primitive operations
Running Benchmarks
Run all benchmarks
cd crates/syntaxis-tui
cargo bench
Run specific benchmark suite
cargo bench --bench rendering_performance
cargo bench --bench event_handling
cargo bench --bench state_mutations
Generate HTML reports
# Reports are automatically generated in: target/criterion/
# Open in browser: target/criterion/report/index.html
Compare with baseline
# First run creates baseline
cargo bench --bench state_mutations
# Later runs compare against baseline
cargo bench --bench state_mutations -- --baseline main
Key Metrics to Monitor
Rendering Performance
Monitor these metrics to catch performance regressions:
- Empty render: Should be <1ms (test backend overhead)
- Small project list (5): Should be <2ms
- Medium project list (10): Should be <3ms
- Large project list (20): Should be <5ms
Event Handling
- Keyboard event parsing: <0.1ms
- Navigation computation: <0.2ms
- Screen transitions: <0.3ms
- Dirty flag ops: <0.01ms
State Mutations
- String operations: <0.5ms
- Vector access: <0.1ms
- Enum creation: <0.01ms
- Complex mutations: <1ms
Integration with CI/CD
Benchmarks can be integrated into CI/CD pipelines:
# Fail if performance degrades beyond 5%
cargo bench -- --output-format bencher | tee output.txt
# Compare baseline (requires previous baseline commit)
Design Pattern Impact on Performance
These benchmarks validate the R-* patterns' performance characteristics:
- R-STATE-SEPARATION: Mutation methods overhead is <0.1ms
- R-WIDGET-COMPOSITION: Pure rendering functions with TestBackend
- R-EVENT-LOOP: Dirty flag check is <0.01ms
- R-RESPONSIVE-LAYOUT: Layout computation is <1ms for any size
Interpreting Results
Green (Good)
- All benchmarks meet targets
- No regressions (within 5% variance)
- Memory usage stable
Yellow (Warning)
- Approaching performance targets (>10% margin)
- Small regressions (5-10%)
- Should investigate and optimize
Red (Critical)
- Missing performance targets
- Large regressions (>10%)
- May indicate algorithm changes or memory leaks
Future Optimization Opportunities
- Memoization: Cache layout computations for same size
- String pooling: Reuse strings in hot paths
- Vector pre-allocation: Pre-allocate vectors for known sizes
- Rendering optimization: Cache widget styles
References
- Criterion documentation: https://bheisler.github.io/criterion.rs/book/
- Rust performance book: https://nnethercote.github.io/perf-book/
- Ratatui performance: Check ratatui issue #1234
Notes
- Benchmarks use
TestBackendto avoid terminal I/O overhead - Criterion uses statistical analysis to detect real performance changes
- HTML reports include graphs and detailed timing distributions
- Sample sizes are tuned for quick feedback (1000-10000 iterations)