Ответ 1
Вообще говоря, сбор мусора - это компромисс между пространством и временем. Дайте GC больше места, и это займет меньше времени. В игре есть (многие) другие факторы, в частности кеш, но компромисс между пространством и временем является самым важным.
Компромисс работает следующим образом: программа выделяет память до тех пор, пока она не достигнет определенного предела (определяется параметрами автоматической настройки GC или явно через параметры RTS). Когда предел достигнут, GC отслеживает все данные, которые в настоящее время использует программа, и восстанавливает всю память, используемую данными, которые больше не требуются. Чем дольше вы можете задержать этот процесс, тем больше данных станет недоступным ( "мертвым" ) тем временем, поэтому GC избегает отслеживания этих данных. Единственный способ отсрочить GC - сделать больше памяти доступной для распределения; следовательно, больший объем памяти равняется меньшему количеству GC, равно более низкому потоку GC. Грубо говоря, опция GHC -H позволяет установить нижнюю границу объема памяти, используемой GC, поэтому может снизить накладные расходы GC.
GHC использует GC генерирующего поколения, который является оптимизацией базовой схемы, в которой куча делится на два или более поколений. Объекты выделяются в "молодое" поколение, а те, которые живут достаточно долго, попадают в "старое" поколение (в настройке 2 поколения). Молодое поколение собирается гораздо чаще, чем старое поколение, идея состоит в том, что "большинство объектов умирают молодыми", поэтому коллекции молодого поколения дешевы (они не тратят много данных), но они восстанавливают много памяти. Грубо говоря, опция -A устанавливает размер молодого поколения - то есть объем памяти, который будет выделен до того, как будет собрано молодое поколение.
Значение по умолчанию для -A равно 512k: рекомендуется сохранить молодое поколение меньше, чем кэш L2, и производительность, как правило, падает, если вы превысите размер кеша L2. Но работа в обратном направлении - это компромисс между пространством/временем GC: использование большого размера молодого поколения может перевесить преимущества кеша, уменьшив объем работы, которую должен выполнить GC. Это не всегда происходит, это зависит от динамики приложения, что затрудняет автоматическую настройку GC. Опция -H также увеличивает размер молодого поколения, поэтому также может отрицательно влиять на использование кеша.
Суть в том, что: поиграйте с опциями и посмотрите, что работает. Если у вас много памяти, вы можете получить повышение производительности, используя либо -A или -H, но не обязательно.