Почему общее состояние ухудшает производительность?

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

Теперь кто-то внедрил кеш-кеш без блокировки (, например, статический словарь ), к которому одновременно обращаются все потоки. Поскольку словарь не изменяется после запуска, нет блокировок. Проблем безопасности Thread не было, но теперь наблюдается ухудшение производительности.

Вопрос в том, что ... поскольку нет блокировок, почему введение этого синглтона создает удар производительности? Что именно происходит под обложками, которые могли бы это объяснить?

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

19 голосов | спросил JoeGeeky 15 ThuEurope/Moscow2011-12-15T23:35:25+04:00Europe/Moscow12bEurope/MoscowThu, 15 Dec 2011 23:35:25 +0400 2011, 23:35:25

2 ответа


8

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

ответил Aidan Cully 16 FriEurope/Moscow2011-12-16T01:44:32+04:00Europe/Moscow12bEurope/MoscowFri, 16 Dec 2011 01:44:32 +0400 2011, 01:44:32
3

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

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

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

Я также попытался бы с помощью ConcurrentDictionary вместо обычного Dictionary, если его использование дает некоторые неожиданные результаты. Есть много вещей, которые можно рассказать о проблеме, если код ConcurrentDictionary окажется намного лучше или намного хуже, чем ваш обычный ---- +: = 5 =:. + ----

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

ответил Mike Nakis 17 SatEurope/Moscow2011-12-17T00:55:23+04:00Europe/Moscow12bEurope/MoscowSat, 17 Dec 2011 00:55:23 +0400 2011, 00:55:23

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132