Олимпиадный код как он есть, отстойный и беспощадный.
Это решение для конкурса Highloadcup (https://highloadcup.ru/, https://github.com/sat2707/hlcupdocs), представляющее собой сервер, реализующий REST API для набора из трёх сущностей (entity, user, location). Список методов API (полное описание - по ссылке):
- GET /entity/id
- GET /users/id/visits
- GET /locations/id/avg
- POST /entity/id
- POST /entity/new
Цель конкурса - в весьма специфичных условиях максимизировать RPS (requests per second) сервера при ответе на запросы.
Данное решение заняло 1 место на конкурсе.
- Ручная реализация асинхронного сервера на основе epoll API
- Busy polling (epoll_wait(0))
- Многопоточная обработка запросов (2 потока отвечают за accept, ещё 2 - за собственно обработку запросов)
- Ручной парсинг узкого подмножества http (впрочем, некоторая обработка ошибок присутствует, как того требовал конкурс)
- Ручная in-memory база данных, оптимизированная под запросы GET
- Минимум аллокаций, собственный аллокатор