Производительность ConcurrentHashmap по сравнению с HashMap

Если у Вас уже есть кадр данных, Вы можете извлекать метаданные (имена столбцов и типы) от кадра данных (например, если Вы управляете ОШИБКОЙ , который только инициирован с определенными исходными данными, и нуждаются в пустом фиктивном Кадре данных):

colums_and_types <- sapply(df, class)

# prints: "c('col1', 'col2')"
print(dput(as.character(names(colums_and_types))))

# prints: "c('integer', 'factor')"
dput(as.character(as.vector(colums_and_types)))

И затем используют read.table для создания пустого кадра данных

read.table(text = "",
   colClasses = c('integer', 'factor'),
   col.names = c('col1', 'col2'))
62
задан Mauli 4 September 2009 в 10:46
поделиться

5 ответов

Я бы порекомендовал вам измерить его, поскольку (по одной причине) может иметь некоторую зависимость от распределения хеширования конкретных объектов, которые вы храните.

4
ответ дан 24 November 2019 в 16:37
поделиться

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

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

Таким образом, если ваша карта будет доступна для параллельных потоков, и вам необходимо гарантировать согласованное представление ее состояния, используйте параллельную хэш-карту.

3
ответ дан 24 November 2019 в 16:37
поделиться

Какого ответа вы здесь ждете?

Очевидно, что будет зависеть от количества операций чтения, одновременно с записью, и от того, как долго карта нормалей должна быть «заблокирована» при операции записи в вашем app (и будете ли вы использовать метод putIfAbsent на ConcurrentMap ). Любой тест будет бессмысленным.

0
ответ дан 24 November 2019 в 16:37
поделиться

Непонятно, что вы имеете в виду. Если вам нужна безопасность потоков, у вас почти нет выбора - только ConcurrentHashMap. И у него определенно есть штрафы за производительность / память в вызове get () - доступ к изменчивым переменным и блокировка, если вам не повезло.

0
ответ дан 24 November 2019 в 16:37
поделиться

Безопасность потоков - сложный вопрос. Если вы хотите сделать объект потокобезопасным, делайте это осознанно и задокументируйте этот выбор. Люди, которые используют ваш класс, будут благодарить вас, если он является потокобезопасным, когда он упрощает их использование, но они проклянут вас, если объект, который когда-то был потокобезопасным, станет не таким в будущей версии. Потоковая безопасность, хотя и очень приятная, предназначена не только для Рождества!

Итак, теперь к вашему вопросу:

ConcurrentHashMap (по крайней мере, в текущей реализации Sun ) работает, разделяя базовую карту на несколько отдельные ведра. Получение элемента не требует какой-либо блокировки как таковой, но использует атомарные / изменчивые операции, что подразумевает барьер памяти (потенциально очень дорогостоящий и мешающий другим возможным оптимизациям).

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

Что касается решения, какую реализацию использовать, выбор, вероятно, прост.

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

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

Если это поле экземпляра, а класс не был разработан для обеспечения потоковой безопасности, тогда задокументируйте его как небезопасный для потоков и используйте HashMap.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

и класс не был разработан для обеспечения потоковой безопасности, тогда задокументируйте его как не потокобезопасный и используйте HashMap.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

и класс не был разработан для обеспечения потоковой безопасности, тогда задокументируйте его как не потокобезопасный и используйте HashMap.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

t был разработан, чтобы быть потокобезопасным, затем задокументируйте его как не потокобезопасный и используйте HashMap.

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

В любом случае, задокументируйте класс как поточно-ориентированный (или условно поточно-ориентированный safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

t был разработан, чтобы быть потокобезопасным, затем задокументируйте его как не потокобезопасный и используйте HashMap.

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

В любом случае, задокументируйте класс как поточно-ориентированный (или условно поточно-ориентированный safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

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

В любом случае задокументируйте класс как поточно-ориентированный (или условно поточно safe), чтобы люди, использующие ваш класс, знали, что они могут использовать объекты в нескольких потоках, а люди, редактирующие ваш класс, знали, что они должны поддерживать безопасность потоков в будущем.

86
ответ дан 24 November 2019 в 16:37
поделиться
Другие вопросы по тегам:

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