Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Бенчмарки
Во что ruststream-gcp-pubsub обходится на каждом сообщении: пропускная способность против сырого
клиента google-cloud-pubsub, инструкции и выделения памяти его кода.
Против сырого клиента
Первый график прогоняет каждый сценарий тремя способами на локальном эмуляторе Pub/Sub. «Сырой
клиент» работает прямо с google-cloud-pubsub. «Крейт брокера» работает с этим крейтом и ничем
выше: его подписка, доставки, которые она отдаёт, и его издатель, а читает и подтверждает их цикл,
вокруг которого нет никакого сервиса. «RustStream» - сервис, который пишет пользователь:
обработчик #[subscriber], приложение и рантайм. Первая разность показывает цену самого крейта
поверх клиента, которого он оборачивает, и за это число отвечает этот репозиторий. Вторая -
сколько сверху добавляет рантайм, именно на Pub/Sub.
Каждый цикл изображён полосой от лучшего круга до самого медленного: точка отмечает лучший круг, засечка - медиану. Ноль оси - лучший круг сырого клиента, и точка правее нуля значит, что цикл медленнее. Пустая точка отмечает цикл, у которого разница с сырым клиентом меньше разброса кругов. Таблица под графиком печатает лучший круг, а в скобках медиану.
Второй сценарий публикует под ключами упорядочивания - это та форма доставки, которую подписка с включённым упорядочиванием обязана сохранять в порядке внутри каждого ключа. Она же добавляет крейту работу, которой нет в первом сценарии: ключ переносится в заголовки доставки, откуда сервис, не называющий брокера, читает его как ключ партиционирования. Цикл на клиенте берёт поле сообщения и не копирует ничего.
Стоимость кода
Второй график считает, во что одно сообщение обходится потоку сервиса: инструкции под callgrind и
выделения памяти под DHAT, в установившемся режиме. Каждый сценарий - сервис в том виде, в каком
его пишет пользователь: он построен на PubSubBroker и запущен против эмулятора того же стенда. В
счёт идёт всё, что делается в потоке сервиса: диспетчеризация фреймворка, код этого крейта и
клиент google-cloud-pubsub, у которого там же работают streaming pull, подтверждения, продление
сроков подтверждения и запросы на публикацию. «Холодный старт» - то, во что один раз обошлись
запуск сервиса и первая доставка.
Большую часть каждой строки составляет клиент. Тяжелее всех строка ответа: рантайм ждёт подтверждения каждого ответа и только потом берёт следующую доставку, поэтому каждый ответ уходит отдельным запросом на публикацию. Холодный старт тоже почти целиком приходится на клиент: он строит два административных клиента, и каждый из них читает и разбирает корневые сертификаты машины, поэтому эта колонка зависит от хранилища сертификатов машины.
Результаты
- Сырой клиент
- Крейт брокера
- RustStream
- круги, от лучшего до самого медленного
- лучший круг
- медианный круг
- разброс кругов
- неразличимо
ruststream-gcp-pubsub 0.7.0 on ruststream 0.7.0, AMD Ryzen 9 7900X 12-Core Processor, Linux 7.2.10-x64v3-xanmod1-1, Pub/Sub emulator, gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators, Google Cloud SDK 587.0.0, in Docker on localhost, измерено 2026-10-18. Как сняты числа
- неразличимо
- неразличимо
- неразличимо
- неразличимо (упирается в брокер)
Показать числа таблицей
| Сценарий | Сырой клиент | Крейт брокера | RustStream | Оверхед |
|---|---|---|---|---|
| Streaming pull, 512 B JSON, ack each | 1 815 msg/s (1 807) | 1 805 msg/s (1 803) (неразличимо к клиенту) | 1 819 msg/s (1 809) | неразличимо |
| Streaming pull with ordering keys, 512 B JSON, ack each | 1 987 msg/s (1 986) | 1 987 msg/s (1 986) (неразличимо к клиенту) | 1 988 msg/s (1 988) | неразличимо (упирается в брокер) |
AMD Ryzen 9 7900X 12-Core Processor, x86_64, 427-5912 MHz, 12 physical, 24 logical, 62.4 GiB, unknown, Linux 7.2.10-x64v3-xanmod1-1, 1.99.0, 3.25.1, bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only), ruststream-gcp-pubsub default (none), ruststream macros,json; google-cloud-pubsub 1.3.0. ruststream-gcp-pubsub 0.7.0, ruststream 0.7.0, измерено 2026-10-18.
Показать числа таблицей
| Сценарий | Инструкции | Выделения | Холодный старт |
|---|---|---|---|
| consume, JSON decode into a small struct, ack each | 10 571 | 5,4 | 87 632 378 / 7 653 |
| reply to a declared topic, each confirmed before the next delivery | 106 926,5 | 88,3 | 87 639 206 / 7 680 |
| consume in batches of 64, assembled on the client | 10 809,5 | 5,5 | 87 640 196 / 7 657 |
Машина
| Процессор | AMD Ryzen 9 7900X 12-Core Processor |
|---|---|
| Архитектура | x86_64 |
| Частота | 427-5912 MHz |
| Ядра | 12 physical, 24 logical |
| Память | 62.4 GiB |
| Скорость памяти | unknown |
| Операционная система | Linux 7.2.10-x64v3-xanmod1-1 |
| Брокер | Pub/Sub emulator, gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators, Google Cloud SDK 587.0.0, in Docker on localhost |
| Круговая задержка | 0.269 ms (20000 GetSubscription calls on one connection); a delivery is charged 1 of them |
| Компилятор | 1.99.0 |
| Профиль сборки | bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only) |
| Фичи | ruststream-gcp-pubsub default (none), ruststream macros,json; google-cloud-pubsub 1.3.0 |
| RUSTFLAGS | none (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU) |
| Valgrind | 3.25.1 |
Флаги сборки публикуются вместе с числами, потому что они эти числа меняют. Бинарник, собранный с
-C target-cpu=native, даёт результат, который не воспроизвести на другой машине, поэтому рецепт
очищает переменную перед сборкой.
Числа берутся из файла docs/benchmarks/results.json этой версии, который записывает рецепт
бенчмарков. Тот же документ, опубликованный по адресу
benchmarks/results.json,
читает сайт фреймворка, чтобы построить сводную таблицу по брокерам. Как сняты числа, объясняет
страница Методология, а какие выводы они позволяют сделать, - страница
Числа.