Go · 39 строк
Zone вызывается на каждый новый заказ, около 3 000 раз в секунду. Файл с полигонами весит 2 МБ, автор рассчитывал прочитать его один раз за жизнь процесса.
После выката профилировщик показал, что 40 % CPU уходит в json.Unmarshal, а заказы во всех районах получают «адрес вне зоны доставки». Отметьте строки с ошибками.
В работе: Сервис, который по даркстору отдаёт полигон его зоны доставки.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных Яндекс Лавки: зоны доставки дарксторов. Условие пересказано своими словами.
Давали на собеседовании?
package zonesimport ("encoding/json""os""sync")type Polygon [][2]float64type ZoneStore struct {once sync.Oncezones map[string]Polygonerr error}// Load читает полигоны 450 дарксторов один раз за жизнь процесса.func (s ZoneStore) Load(path string) error {var err errors.once.Do(func() {raw, e := os.ReadFile(path)if e != nil {err = ereturn}s.zones = make(map[string]Polygon)err = json.Unmarshal(raw, &s.zones)})return err}// Zone вызывается на каждый заказ, 3000 RPS.func (s *ZoneStore) Zone(storeID string) (Polygon, bool) {if s.zones == nil {s.Load("/etc/lavka/zones.json")}p, ok := s.zones[storeID]return p, ok}