Бенчмарки

Измерено, а не обещано.

Release-сборка на macOS arm64 · 10 ядер · 16 × ~2047 KB файлов. Все сценарии офлайн — без сети и LLM — поэтому их можно гонять в CI.

Накладные расходы диспетчеризации

Сколько машинного кода разделяет вызов инструмента LLM и собственно работу.

ИзмерениеИтерацииНа вызов
registry.execute (raw dispatch)3005140 µs
execute_batch, 1 call3007614 µs
execute_batch, 8 calls (amortized)3205893 µs
ToolCall args serde round-trip100000752 ns

Overhead исполнителя над сырой диспетчеризацией: 2473 мкс на батч из одного вызова; амортизированный overhead падает до 753 мкс на вызов в батче из 8.

Fathom vs последовательно — I/O-нагруженные

16 × file_read несовпадающих файлов по ~2047 КБ.

последовательно
79.0 ms
1.00×
join_all
83.7 ms
0.94×
spawn (tokio)
25.8 ms
3.06×
execute_batch_spawnпоследовательно / join_all

16/16 вызовов успешно (join_all), 16/16 (spawn); все классифицированы как параллельно-безопасные.

Fathom vs последовательно — CPU-нагруженные

8 × parse_html таблицы ~1 МБ (3000 строк), селектор `tr.item`, режим texts.

последовательно
130.3 ms
1.00×
join_all
72.4 ms
1.80×
spawn (tokio)
34.5 ms
3.78×

join_all делит один поток — spawn распределяет CPU-работу по ядрам.

Смешанный батч — автоматическое разбиение

Реалистичный ход агента: чтения (параллельно-безопасные) + записи (последовательно) в одном батче. 5 — конкурентно, 3 — последовательно; суммарно 70.9 мс, 8 успешно. Порядок сохранён.

ИнструментФазаУспехДлительность
file_read (r0)parallel✅16 ms
file_read (r1)parallel✅20 ms
file_read (r2)parallel✅25 ms
file_read (r3)parallel✅29 ms
file_write (w0)sequential✅2 ms
file_write (w1)sequential✅0 ms
file_write (w2)sequential✅0 ms
grep (g0)parallel✅65 ms

Масштабирование parse_html с размером документа

Тот же селектор (`tr.item`, texts-режим), растущий размер документа. До 531k строк/с.

ДокументСтрокиСр. парсингПропускная способность
6 KB1000.19 ms531,915 rows/s
63 KB10004.08 ms245,339 rows/s
191 KB30009.55 ms314,268 rows/s
773 KB1200034.22 ms350,723 rows/s

Пропускная способность extract_json

~4 МБ JSON-документ с 20 000 объектов. Без сохранения состояния и параллельно-безопасен (пере-парсится на каждый вызов).

ЗапросИтерацииСреднее
wildcard scan `items[*].value` (limit 500)1071.24 ms
deep single key `items.12345.meta.score`1067.78 ms
top-level key `total`1043.47 ms

web_feed (quick-xml) — масштабирование и параллелизм

Локальный RSS-фикстур; устойчивость к размеру фида и CPU-скорости при параллелизме. До 1.1M элементов/с.

Элементы фидаСр. парсингЭлементов/с
10000.93 ms1,077,586
50004.78 ms1,045,588
1200010.81 ms1,110,391
2000027.10 ms738,089
последовательно
236.2 ms
1.00×
spawn
188.6 ms
1.25×

8 × web_feed фида ~5 МБ; 8/8 успешно в обоих режимах.

code_symbols / repo_map — извлечение символов

240 Rust-файлов (~14 КБ каждый, 40 функции + 40 структур + impl на файл).

ИнструментРежимВремя выполненияЭлементы
code_symbolssingle7.2 ms7007 lines
repo_mapsingle34.2 ms4330 lines
последовательно
61.9 ms
1.00×
join_all
32.6 ms
1.90×
spawn
20.4 ms
3.04×

8/8 сканирований символов успешно (join_all), 8/8 (spawn).

Семантическая память — absorb / search / digest

Офлайн TF-IDF эмбеддер (без сети и LLM); in-memory SQLite.

БатчПоглощеноВремя выполненияНа факт
101010.2 ms1020 µs
100899.4 ms94 µs
50033582.6 ms165 µs

Повторный absorb 100 известных фактов: 93 пропущено, 0 создано за 5.1 мс (быстрый путь дедупликации).

Гибридный поискСовпаденияМедиана
Acme revenue units filing52.30 ms
Globex churn rate report51.62 ms
headcount in Kazan during 202252.23 ms
Initech margin units51.95 ms
support load Dubai filing51.66 ms
Размер хранилищаВремя заполненияМедиана поиска
1000 memories53 ms5.28 ms
5000 memories926 ms23.52 ms
10000 memories828 ms47.47 ms

Сборка дайджеста (релевантное + TODO + недавнее): 4 релевантных воспоминания за 4.76 мс.

Воспроизвести

Benchmarks run on provisioned servers. See the GitHub repository for the benchmark source and reproduction instructions. Numbers above are a snapshot on macOS arm64 (10 cores), release build.

Качество и тестирование

МетрикаДетали
Unit tests1000+ tests across 13 workspace crates
Property-based testingproptest for email/phone parsers, SSE parser, absorb pipeline, tokenizer
CI-gated benchmarksEvery release must pass performance baselines

Полевые заметки: 31× на repo_map

Бенчмарки — это как мы ловим регрессии и находим выигрыши. Профилирование repo_map вскрыло молча сериализованный regex-проход; перевод его на кешируемый OnceLock-компилятор сократил время с 902 мс до 29.5 мс (31×). Тот же аудит дал 3.12× / 5.16× на web_feed и code_symbols под execute_batch_spawn.