Недавно я сравнивал сборщик мусора .NET 4, интенсивно выделяя его из нескольких потоков. Когда выделенные значения были записаны в массиве, я не наблюдал масштабируемости, как я и ожидал (поскольку система поддерживает синхронный доступ к совместно используемому старому поколению). Однако, когда выделенные значения были немедленно отброшены, я был в ужасе, чтобы не наблюдать никакой масштабируемости тогда!
Я ожидал, что временный случай будет масштабироваться почти линейно, потому что каждый поток должен просто стереть питомник gen0 clean и начать снова, не сражаясь за какие-либо общие ресурсы (ничего не сохранится для старых поколений и не хватает промахов в L2, потому что gen0 легко вписывается в кеш L1).
Например, в этой статье MSDN говорится:
Распределения без синхронизации В многопроцессорной системе генерация 0 управляемой кучи разделяется на несколько областей памяти, используя одну арену на поток. Это позволяет нескольким потокам делать выделения одновременно, поэтому исключительный доступ к куче не требуется.
Может ли кто-нибудь подтвердить мои выводы и/или объяснить это несоответствие между моими прогнозами и наблюдениями?