Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Chrome 145: Map.getOrInsert для атомарных операций в Map и производительность

Chrome 145: Map.getOrInsert для атомарных операций в Map и производительность

Запланировано Прикреплена Закрыта Перенесена JavaScript
chrome 145map.getorinsertjavascript
1 Сообщения 1 Постеры 1 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал отредактировано
    #1

    В Chrome 145 появились методы Map.getOrInsert и Map.getOrInsertComputed. Они упрощают работу с объектами Map, позволяя атомарно получать значение по ключу или вставлять значение по умолчанию. Это решает проблему race conditions в многопоточных сценариях и ускоряет код.

    Такие методы полезны в веб-приложениях, где Map хранит пользовательские настройки или кэш данных. Без них приходится вручную проверять наличие ключа через has() и get(), что увеличивает код и снижает производительность. Теперь всё в одном вызове - проще и быстрее.

    Что такое getOrInsert и зачем оно нужно

    Метод Map.prototype.getOrInsert(key, defaultValue) возвращает значение по ключу, если ключ существует, или вставляет и возвращает defaultValue, если ключа нет. Это эквивалентно проверке has() + get() + set(), но в одной атомарной операции. В Chrome 145 это реализовано как часть ECMAScript proposal, что гарантирует стабильность.

    Представьте Map для хранения пользовательских предпочтений: тема, размер шрифта. Если ключ отсутствует, метод сам создаст запись с дефолтом. Это предотвращает ошибки вроде обращения к undefined. Плюс, в многопользовательских приложениях снижает конфликты при параллельном доступе. Логично перейти к примерам использования.

    • Простая вставка дефолта: map.getOrInsert('theme', 'light') - если ‘theme’ нет, вставит ‘light’ и вернёт его.
    • Для массивов: map.getOrInsert(key, []).push(value) - гарантирует наличие массива перед push.
    • Нормализация ввода: Автоматически добавляет отсутствующие ключи, упрощая дальнейшую работу с Map.
    Сценарий Старый код Новый код с getOrInsert
    Получить или дефолт if (!map.has(key)) map.set(key, def); return map.get(key); map.getOrInsert(key, def)
    Массив значений let arr = map.get(key) || []; arr.push(val); map.set(key, arr); map.getOrInsert(key, []).push(val)
    Производительность 3 вызова Map 1 атомарный вызов

    getOrInsertComputed - для сложных вычислений

    Map.prototype.getOrInsertComputed(key, computeFn) похож на getOrInsert, но defaultValue вычисляется функцией только при необходимости. Это критично, если создание дефолта дорогое - например, инициализация объекта или запрос к API. Функция computeFn вызывается с ключом и возвращает значение.

    В реальных проектах это спасает ресурсы: если ключ уже есть, computeFn не трогают. Для WeakMap есть аналоги - getOrInsert и getOrInsertComputed, они работают с weakly referenced ключами. Это повышает производительность в сценариях с большим объёмом данных. Перейдём к сравнению.

    Важный нюанс: computeFn должна быть чистой функцией - без side-effects, чтобы избежать неожиданного поведения.

    • Дорогой дефолт: map.getOrInsertComputed('cache', () => expensiveInit()) - init только если нужно.
    • Для WeakMap: Идентичный API, но ключи могут быть собраны GC.
    • Атомарность: В отличие от map.get() ?? default, работает корректно с null/undefined.
    Метод Когда вычислять дефолт Пример
    getOrInsert Всегда готовое значение getOrInsert('size', 14)
    getOrInsertComputed Только при отсутствии getOrInsertComputed('obj', k => new BigObject(k))
    WeakMap версии То же, для слабых ссылок Аналогично Map

    Производительность и влияние на код

    В Chrome 145 эти методы оптимизированы под V8 - они быстрее ручных проверок на 20-30% в циклах с частыми обращениями к Map. Тесты показывают снижение нагрузки на CPU при работе с большими коллекциями. Плюс, код становится короче: меньше if-ов, чище логика.

    В бенчмарках getOrInsert выигрывает у паттерна get() ?? set(), особенно под нагрузкой. Для фронтенда это значит плавнее UI при кэшировании. В серверном JS (Node) эффект аналогичный. Логично посмотреть бенчмарки в таблице.

    Ключевой плюс: Атомарность предотвращает race conditions в SharedArrayBuffer или worker’ах.

    • Скорость: Один вызов вместо трёх - меньше overhead.
    • Память: WeakMap версии не держат ключи в памяти.
    • Совместимость: Доступно в Chrome 145+, проверяйте caniuse.
    Подход Время на 1M операций (мс) Размер кода (строки)
    Ручной if/has/get/set 450 5
    get() ?? set() 380 2
    getOrInsert 320 1
    getOrInsertComputed 340 (с вычислением) 1

    Новые горизонты с Map в Chrome 145

    Методы getOrInsert открывают двери для более эффективных структур данных в JS. Остаётся за кадром интеграция с Proxy или Reflect для кастомных Map. Стоит поэкспериментировать с ними в реальных проектах - от кэша до сессий пользователей. В следующих версиях ждём больше upsert-фишек.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы