Почему большинство тестов производительности роутеров вводят в заблуждение?
Каждый тест производительности роутера имеет своего победителя. Часто это именно тот роутер, который предпочёл автор теста. Это не всегда связано с недобросовестностью автора; иногда проблема заключается в том, что тесты слишком узкие или недостаточно реалистичные.
Node.js роутеры являются прекрасным примером такой ситуации. Можно создать график, где Hono выглядит непобедимым, а можно построить другой, где только трие-роутеры выглядят как единственно серьёзный выбор. И ещё один вариант, когда какой-то другой роутер внезапно оказывается лучшим. Именно поэтому я решил провести тестирование роутеров таким образом, чтобы результаты были менее лестными и более раздражающими.
Что было протестировано?
В ходе тестирования были проверены следующие роутеры:
- Express
- Fastify (find-my-way)
- Rou3
- Hono
- @prostojs/router
Но прежде чем перейти к результатам, стоит отметить самое важное: что именно измерялось. Исходный код бенчмарка доступен здесь: router-benchmark.
Стоит обратить внимание на то, что rou3 – это не просто случайный роутер на сравнительной диаграмме. Он используется для маршрутизации в H3, на основе которого построен Nitro, а серверные маршруты Nuxt работают на Nitro. Таким образом, цепочка выглядит следующим образом: rou3 → H3 → Nitro → Nuxt.
Основное правило проведения тестов
Тесты производительности роутеров часто вводят в заблуждение потому, что они не измеряют одинаковую работу. Некоторые роутеры извлекают параметры сразу же, другие возвращают внутренние структуры, которые всё равно нужно декодировать. Если тест останавливается до последнего шага, числа выглядят чище, чем реальность – отлично подходит для презентаций, но плохо отражает действительность.
Поэтому мой тест заставляет выполнять полную работу поиска маршрута:
- сопоставление маршрута
- извлечение параметров
- обработка статических, параметрических, динамических маршрутов и случаев отсутствия совпадений
- проверка коротких, длинных и смешанных наборов маршрутов
Это гораздо более справедливое сравнение, так как реальные приложения нуждаются в параметрах, а не только в самом маршруте.
Кроме того, я не ограничился одним набором маршрутов. Тест охватывает:
- короткие маршруты
- длинные корпоративного стиля маршруты
- смешанные наборы маршрутов
- масштабируемый запуск от 22 до 200 маршрутов
Потому что «самый быстрый роутер» при наличии всего лишь 22 простых маршрутов – это совсем другая история, нежели вопрос о том, что происходит, когда таблица маршрутов начинает напоминать реальный бэкэнд.