Как говорит @WillemVanOnsem, в терминах GH C резидент 35 КБ - это ничтожно мало. Какая бы у вас ни была проблема с производительностью, она не имеет ничего общего с этим крошечным битом закрепленной памяти. Первоначально я сказал, что это, вероятно, Vector
s, но это неправильно. Data.Text
использует закрепленную память, а Data.Vector
- нет. Этот бит ЗАКРЕПЛЕННОЙ памяти выглядит так, как будто он на самом деле из самой системы выполнения, поэтому вы можете игнорировать его (см. Ниже).
В коде GH C «общее выделение» - это мера обработки. Программа GH C - это механизм распределения. Если он не распределяет, он, вероятно, ничего не делает (за редкими исключениями). Итак, если вы ожидаете, что ваш алгоритм будет работать за O (n) time , тогда он также будет O (n) в общем распределении, обычно на уровне гигабайт.
Что касается " редкие исключения », программа GH C может работать с постоянным« общим распределением », но непостоянным временем, если агрессивная оптимизация допускает вычисления с использованием полностью распакованных значений. Так, например:
main = print (sum [1..10000000] :: Int)
выполняется с постоянным общим распределением (например, 50 КБ выделено в куче), потому что Int
s можно распаковать. Для сравнения:
main = print (sum [1..10000000] :: Integer)
выполняется с общим объемом выделения O (n) (например, 320 МБ выделено в куче). Кстати, попробуйте профилировать эту последнюю программу (и увеличивайте счет, пока она не проработает достаточно долго, чтобы сгенерировать несколько секунд данных профиля). Вы увидите, что он использует такой же объем ЗАКРЕПЛЕННОЙ памяти, что и ваша программа, и этот объем не меняется с верхним пределом. Итак, это просто накладные расходы системы времени выполнения.
Вернемся к вашему примеру ... Если вас беспокоит производительность, вероятно, виноват System.Random
. Это ЧРЕЗВЫЧАЙНО медленный генератор случайных чисел. Если я запустил вашу программу с n = 10000000
, это займет 4 секунды. Если я заменю генератор случайных чисел на простой LCG:
randoms :: Word32 -> [Word32]
randoms seed = tail $ iterate lcg seed
where lcg x = (a * x + c)
a = 1664525
c = 1013904223
, он будет работать за 0,2 секунды, то есть в 20 раз быстрее.