use criterion::{black_box, criterion_group, criterion_main, Criterion}; use tele_tui::formatting::format_text_with_entities; use tdlib_rs::enums::{TextEntity, TextEntityType}; fn create_text_with_entities() -> (String, Vec) { let text = "This is bold and italic text with code and a link and mention".to_string(); let entities = vec![ TextEntity { offset: 8, length: 4, // bold type_: TextEntityType::Bold, }, TextEntity { offset: 17, length: 6, // italic type_: TextEntityType::Italic, }, TextEntity { offset: 34, length: 4, // code type_: TextEntityType::Code, }, TextEntity { offset: 45, length: 4, // link type_: TextEntityType::Url, }, TextEntity { offset: 54, length: 7, // mention type_: TextEntityType::Mention, }, ]; (text, entities) } fn benchmark_format_simple_text(c: &mut Criterion) { let text = "Simple text without any formatting".to_string(); let entities = vec![]; c.bench_function("format_simple_text", |b| { b.iter(|| { format_text_with_entities(black_box(&text), black_box(&entities)) }); }); } fn benchmark_format_markdown_text(c: &mut Criterion) { let (text, entities) = create_text_with_entities(); c.bench_function("format_markdown_text", |b| { b.iter(|| { format_text_with_entities(black_box(&text), black_box(&entities)) }); }); } fn benchmark_format_long_text(c: &mut Criterion) { let mut text = String::new(); let mut entities = vec![]; // Создаем длинный текст с множеством форматирований for i in 0..100 { let start = text.len(); text.push_str(&format!("Word{} ", i)); // Добавляем форматирование к каждому 3-му слову if i % 3 == 0 { entities.push(TextEntity { offset: start as i32, length: format!("Word{}", i).len() as i32, type_: TextEntityType::Bold, }); } } c.bench_function("format_long_text_with_100_entities", |b| { b.iter(|| { format_text_with_entities(black_box(&text), black_box(&entities)) }); }); } criterion_group!( benches, benchmark_format_simple_text, benchmark_format_markdown_text, benchmark_format_long_text ); criterion_main!(benches);