Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Бенчмарки

Во что 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. Как сняты числа

Streaming pull, 512 B JSON, ack each
  • неразличимо
  • неразличимо
Streaming pull with ordering keys, 512 B JSON, ack each
  • неразличимо
  • неразличимо (упирается в брокер)
Показать числа таблицей
СценарийСырой клиентКрейт брокераRustStreamОверхед
Streaming pull, 512 B JSON, ack each1 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 each1 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
reply to a declared topic, each confirmed before the next delivery
106 926,5
88,3
consume in batches of 64, assembled on the client
10 809,5
5,5
Показать числа таблицей
СценарийИнструкцииВыделенияХолодный старт
consume, JSON decode into a small struct, ack each10 5715,487 632 378 / 7 653
reply to a declared topic, each confirmed before the next delivery106 926,588,387 639 206 / 7 680
consume in batches of 64, assembled on the client10 809,55,587 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
RUSTFLAGSnone (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU)
Valgrind3.25.1

Флаги сборки публикуются вместе с числами, потому что они эти числа меняют. Бинарник, собранный с -C target-cpu=native, даёт результат, который не воспроизвести на другой машине, поэтому рецепт очищает переменную перед сборкой.

Числа берутся из файла docs/benchmarks/results.json этой версии, который записывает рецепт бенчмарков. Тот же документ, опубликованный по адресу benchmarks/results.json, читает сайт фреймворка, чтобы построить сводную таблицу по брокерам. Как сняты числа, объясняет страница Методология, а какие выводы они позволяют сделать, - страница Числа.