Ответ 1
Я не уверен, почему это так сильно влияет на коробку Vector
s, но вы тратите много времени на
V.freeze m3
Это создает копию m3
каждый раз. Таким образом, вы копируете 100 000 Vector
увеличения длины. Тебе больше не нужны старые, поэтому они собираются с мусором. Сбор мусора в коробке Vector
занимает гораздо больше времени, чем сборка unboxed Vector
, потому что все указатели должны быть соблюдены, чтобы увидеть, могут ли быть собраны также получатели. Я немного удивлен тем, насколько сильно он отличается.
Несколько статистических данных:
$ cat ./testVals | ./OldBoxed +RTS -t > Bxd.txt
<<ghc: 72590744976 bytes, 79999 GCs, 5696847/15655472 avg/max bytes residency (16 samples),
802M in use, 0.00 INIT (0.00 elapsed), 36.97 MUT (37.01 elapsed), 52.60 GC (52.67 elapsed) :ghc>>
$ cat ./testVals | ./OldUnboxed +RTS -t > UBxd.txt
<<ghc: 72518297568 bytes, 78256 GCs, 1013955/2294848 avg/max bytes residency (63 samples),
81M in use, 0.00 INIT (0.00 elapsed), 9.14 MUT (9.16 elapsed), 0.60 GC (0.60 elapsed) :ghc>>
Итак, вы видите, что огромная разница связана с GC, althogh MUT (время, когда ваша программа выполняет фактическую работу) намного меньше для unboxed.
Теперь, если мы заменим оскорбление freeze
на unsafeFreeze
, получим
$ cat ./testVals | ./Boxed +RTS -t > Bxd.txt
<<ghc: 1149880088 bytes, 2214 GCs, 5236803/17102432 avg/max bytes residency (11 samples),
39M in use, 0.00 INIT (0.00 elapsed), 0.53 MUT (0.53 elapsed), 0.29 GC (0.29 elapsed) :ghc>>
$ cat ./testVals | ./Unboxed +RTS -t > UBxd.txt
<<ghc: 1152277200 bytes, 2229 GCs, 767477/2267200 avg/max bytes residency (31 samples),
7M in use, 0.00 INIT (0.00 elapsed), 0.61 MUT (0.62 elapsed), 0.04 GC (0.04 elapsed) :ghc>>
который предоставляет гораздо меньшую разницу. Фактически, здесь в коробке Vector
требовалось меньше времени от мутатора, чем распакованное. Время GC все еще намного выше, но, тем не менее, общий unboxed все еще быстрее, но на 0,66 с против 0,82, это ничего не драматично.