use criterion::{black_box, criterion_group, criterion_main, Criterion}; use vapora_tracking::parsers::{ClaudeTodoParser, MarkdownParser}; fn markdown_parse_changes_bench(c: &mut Criterion) { let content = "---\nproject: vapora\nlast_sync: 2025-11-10T14:30:00Z\n---\n\n\ ## 2025-11-10T14:30:00Z - Implemented WebSocket sync\n\ **Impact**: backend | **Breaking**: no | **Files**: 5\n\ Non-blocking async synchronization using tokio channels.\n\n\ ## 2025-11-09T10:15:00Z - Fixed database indices\n\ **Impact**: performance | **Breaking**: no | **Files**: 2\n\ Optimized query performance for tracking entries.\n\n\ ## 2025-11-08T16:45:00Z - Added error context\n\ **Impact**: infrastructure | **Breaking**: no | **Files**: 3\n\ Improved error messages with structured logging.\n"; c.bench_function("markdown_parse_changes_small", |b| { b.iter(|| MarkdownParser::parse_changes(black_box(content), black_box("/test"))) }); } fn markdown_parse_todos_bench(c: &mut Criterion) { let content = "---\nproject: vapora\nlast_sync: 2025-11-10T14:30:00Z\n---\n\n\ ## [ ] Implement webhook system\n\ **Priority**: H | **Estimate**: L | **Tags**: #feature #api\n\ **Created**: 2025-11-10T14:30:00Z | **Due**: 2025-11-15\n\ Implement bidirectional webhook system for real-time events.\n\n\ ## [>] Refactor database layer\n\ **Priority**: M | **Estimate**: M | **Tags**: #refactor #database\n\ **Created**: 2025-11-08T10:00:00Z | **Due**: 2025-11-20\n\ Improve database abstraction and reduce code duplication.\n\n\ ## [x] Setup CI/CD pipeline\n\ **Priority**: H | **Estimate**: S | **Tags**: #infrastructure\n\ **Created**: 2025-11-05T08:00:00Z\n\ GitHub Actions workflow for automated testing.\n"; c.bench_function("markdown_parse_todos_small", |b| { b.iter(|| MarkdownParser::parse_todos(black_box(content), black_box("/test"))) }); } fn claude_todo_parser_bench(c: &mut Criterion) { let content = r#"[ { "content": "Implement feature X", "status": "pending" }, { "content": "Fix bug in parser", "status": "in_progress" }, { "content": "Update documentation", "status": "completed" } ]"#; c.bench_function("claude_todo_parse_small", |b| { b.iter(|| ClaudeTodoParser::parse(black_box(content), black_box("/test"))) }); } criterion_group!( benches, markdown_parse_changes_bench, markdown_parse_todos_bench, claude_todo_parser_bench ); criterion_main!(benches);