Параметры конструктора ConcurrentHashMap?

Управление типами с помощью команд typings и tsd в конечном счете устарело в пользу использования npm через npm install @types/lodash.

Однако я боролся с «Не могу найти модуль lodash» в инструкции import для долгое время:

import * as _ from 'lodash';

В конечном итоге я понял, что TypScript будет загружать только типы из node_modules / @ types start version 2, а моя служба VsCode Language по-прежнему использует 1.8, поэтому редактор сообщал об ошибках.

Если вы используете VSCode, вы захотите включить

"typescript.tsdk":  "node_modules/typescript/lib"

в свой файл настроек VSCode.json (для параметров рабочей области) и убедитесь, что у вас есть машинописная версия> = 2.0.0, установленный через npm install typescript@2.0.2 --save-dev

. После этого мой редактор не будет жаловаться на инструкцию import.

23
задан Dave Jarvis 15 October 2009 в 17:45
поделиться

4 ответа

Краткий ответ: установите «начальную емкость» примерно равной количеству отображений, которые вы ожидаете поместить на карту, и оставьте другие параметры по умолчанию.

Длинный ответ:

  • коэффициент загрузки - это отношение количества «сегментов» на карте к числу ожидаемых элементов;

  • 0.75 обычно является разумным компромиссом - насколько я помню, это означает, что при хорошей хеш-функции в среднем мы ожидаем, что около 1.6 перенаправлений найдет элемент на карте (или вокруг этой фигуры);

    • изменение коэффициента загрузки меняет компромисс между большим количеством переадресаций, чтобы найти элемент, но с меньшим количеством потерянного пространства - обычно значение 0,75 действительно хорошее;

    • в принципе, установите ConcurrencyLevel равным количеству одновременных потоков, которые, как вы ожидаете, будут изменять карту, хотя переоценка этого, по-видимому, не имеет плохого эффекта, кроме траты памяти (я немного писал о производительности ConcurrentHashMap некоторое время назад в если вам интересно)

Неофициально, ваша хеш-функция должна, по сути, стремиться иметь столько же «случайности» в битах, сколько p жно. Или, если быть более точным, хэш-код для данного элемента должен давать каждому биту примерно 50% шанс быть установленным. На самом деле это проще проиллюстрировать на примере: опять же, вас могут заинтересовать некоторые вещи, которые я написал о , как работает хеш-функция String и соответствующие рекомендации по хеш-функциям . Обратная связь приветствуется по любому из этих вопросов.

Одна вещь, которую я также упомянул в какой-то момент, заключается в том, что вам не нужно быть слишком параноиком на практике: если ваша хэш-функция производит «разумное» количество случайности в некоторых битах, то это часто будет хорошо. В худшем случае склеивание репрезентативных фрагментов данных в строку и получение хеш-кода строки на самом деле не так уж плохо.

17
ответ дан Neil Coffey 29 November 2019 в 02:56
поделиться

Коэффициент загрузки прежде всего связан с качеством хеш-функции. Чем ближе к нулю коэффициент загрузки, тем меньше вероятность столкновений, даже если хеш-функция не так велика. Компромисс в том, что объем памяти больше. Другими словами, HashMap не распределяет записи в отдельных сегментах для каждого отдельного хэш-кода, а группирует их по близости, поэтому чем больше сегментов, тем больше разброс распределения, тем меньше вероятность возникновения коллизий.

Итак, суть в том, что вы играете с коэффициентом загрузки, чтобы улучшить время поиска или уменьшить память, в соответствии с вашими потребностями и объектами, которые вы храните на карте.

ConcurrencyLevel действительно зависит от вашего приложения. Если у вас есть только два или три потока, запущенных в приложении, то вы идете. Если вы сервер приложений с произвольным числом потоков, вам необходимо понять, какова ваша нагрузочная способность и для какой точки вы хотите оптимизировать.

Качественная реализация хэш-кода обеспечивает максимально широкое распределение по потенциальным значениям объекта с наименьшим количеством коллизий при соблюдении контракта. Другими словами, он позволяет HashMap (или Set в зависимости от обстоятельств) распределять объекты в отдельные сегменты, ускоряя поиск.

4
ответ дан Yishai 29 November 2019 в 02:56
поделиться

loadFactor по умолчанию имеет значение 0,75, какие критерии следует использовать для настройки этого параметра вверх или вниз?

Вам необходимо иметь представление о том, как работают хэш-карты, прежде чем вы сможете понять, как это работает. Карта по сути представляет собой серию ведер. Каждое значение на карте помещается в корзину в зависимости от того, какой у нее хэш-код. LoadFactor означает, что, если сегменты заполнены более чем на 75%, размер карты должен быть изменен

concurrencyLevel по умолчанию установлен на 16, как мы устанавливаем количество одновременно обновляемых потоков? Какие критерии следует использовать, чтобы изменить это значение вверх или вниз?

Здесь задается вопрос, сколько потоков вы ожидаете изменить карту одновременно (одновременно)

Хэш-коды см. В Джошуа Эффективная Java Блоха

0
ответ дан Kevin 29 November 2019 в 02:56
поделиться

loadFactor: controls when the implementation decides to resize the hashtable. Too high a value will waste space; too low a value will result in expensive resize operations.

concurrencyLevel: tells the implementation to try to optimize for the given number of writing threads. According to the API docs, being off by up to a factor of 10 shouldn't have much effect on performance.

The allowed concurrency among update operations is guided by the optional concurrencyLevel constructor argument (default 16), which is used as a hint for internal sizing. The table is internally partitioned to try to permit the indicated number of concurrent updates without contention. Because placement in hash tables is essentially random, the actual concurrency will vary. Ideally, you should choose a value to accommodate as many threads as will ever concurrently modify the table. Using a significantly higher value than you need can waste space and time, and a significantly lower value can lead to thread contention. But overestimates and underestimates within an order of magnitude do not usually have much noticeable impact.

A good hashcode implementation will distribute the hash values uniformly over any interval. If the set of keys is known in advance it is possible to define a "perfect" hash function that creates a unique hash value for each key.

0
ответ дан 29 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: