Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Числа
Что измеряют числа бенчмарков ruststream-kinesis и каких выводов они сделать не позволяют.
Сравнение с сырым клиентом
Три цикла одной строки сравнимы между собой: они шли в одном процессе, чередуясь, на одной конечной точке. Со строкой, которую публикует другой крейт брокера, строка не сравнима: транспорты выполняют на запись разную работу.
Одно чтение приносит до тысячи записей, поэтому его доля на одну запись мала. В строке с DynamoDB
каждая запись стоит ещё и собственную условную запись в таблицу - контрольную точку за её ack. В
строке «упирается в эмулятор» круговые задержки заняли не меньше половины времени доставки. Работа
крейта и рантайма тогда укладывается в ожидание, которое оплачивает и сырой клиент, и разница
между циклами - нижняя граница этой работы, а не её измерение.
Темп обеих строк задаёт то, как быстро эмулятор принимает и отдаёт записи одного сегмента, какой бы цикл их ни читал, а арифметика круговых задержек этого не учитывает. Поэтому все три цикла строки попадают в разброс друг друга. Строки говорят, что ни этот крейт, ни рантайм не замедляют чтение сверх предела, который задаёт эмулятор. Они не говорят, как три цикла соотносились бы на более быстром стенде.
Стоимость кода
Счёт инструкций включает рантайм, этот крейт и работу AWS SDK на потоке выполнения сервиса: сборку
и подпись каждого запроса, обмен по HTTP и разбор каждого ответа. Доставка оплачивает свою долю
GetRecords, а ответ добавляет собственный PutRecord, поэтому строка ответа - почти целиком
работа SDK. Большая часть каждого числа - работа SDK, а не этого крейта, и числа не сравнимы с
числами брокера, клиент которого работает в собственных потоках выполнения. Тот же счёт стоит
больше времени там, где код промахивается мимо кэша, поэтому счёт инструкций - не время.
Каждое число - установившийся режим, разность между прогоном на 1000 доставок и прогоном на 2000. Подключение, открытие подписки, получение списка сегментов, взятие аренды и итератора и первые выделения памяти за ними - холодный старт, который оплачивается один раз.
Чего они не значат
Стенд - LocalStack, эмулятор Kinesis и DynamoDB, а не облачный сервис. Он отвечает по простому HTTP через loopback, и в замер не попадают согласование TLS, обновление учётных данных и задержка региона. Сравнение остаётся верным, потому что все три цикла работают с одним и тем же эмулятором. Пропускная способность не переносится: у потока в регионе есть пределы на сегмент, и отвечает он в другом масштабе времени.
Строка - это один сегмент, один потребитель и тело в 512 байт. Она измеряет, сколько стоит запись внутри этого крейта, а не сколько способен пропустить Kinesis.
Окно закрывается, когда прочитано поле последней записи, до её контрольной точки, во всех трёх циклах, поэтому одна контрольная точка прогона везде остаётся за пределами числа. Потребитель, который догнал заполняющие задачи, ждёт паузу в 20 миллисекунд после пустого чтения, и эта пауза засчитывается записи, которую она задерживает.
Числа - снимок одной машины в один день, а рядом с ними записана сборка. Их перемеряют вручную, на машине, отданной только прогону: различия, которые они показывают, меньше шума общей машины.