В этом синтетическом тестовом случае порождение аппаратных потоков приводит к значительным накладным расходам. Работа только с зелеными нитями выглядит как предпочтительный вариант. Обратите внимание, что порождение зеленых нитей в Haskell действительно дешево. Я перезапустил вышеупомянутую программу с n = 1 м на MacBook Pro, i7, 8 ГБ ОЗУ, используя:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
Скомпилировано с -threaded и -rtsopts:
$ time ./thr
1000000
real 0m5.974s
user 0m3.748s
sys 0m2.406s
Уменьшение стека немного помогает:
$ time ./thr +RTS -k0.5k
1000000
real 0m4.804s
user 0m3.090s
sys 0m1.923s
Затем компилируется без -потоковой:
$ time ./thr
1000000
real 0m2.861s
user 0m2.283s
sys 0m0.572s
И, наконец, без резьбы и с уменьшенным стеком:
$ time ./thr +RTS -k0.5k
1000000
real 0m2.606s
user 0m2.198s
sys 0m0.404s