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