System.Random is very slow. Try the mwc-random package from Hackage.<br><br><div class="gmail_quote">On Wed, Oct 17, 2012 at 9:07 AM, Dmitry Vyal <span dir="ltr"><<a href="mailto:akamaus@gmail.com" target="_blank">akamaus@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello anyone<br>
<br>
I've written a snippet which generates a file full of random strings. When compiled with -O2 on ghc-7.6, the generation speed is about 2Mb per second which is on par with interpreted php. That's the fact I find rather disappointing. Maybe I've missed something trivial? Any suggestions and explanations are welcome. :)<br>
<br>
% cat ext_sort.hs<br>
import qualified Data.Text as T<br>
import System.Random<br>
import Control.Exception<br>
import Control.Monad<br>
<br>
import System.IO<br>
import qualified <a href="http://Data.Text.IO" target="_blank">Data.Text.IO</a> as TI<br>
<br>
gen_string g = let (len, g') = randomR (50, 450) g<br>
in T.unfoldrN len rand_text (len, g')<br>
where rand_text (0,_) = Nothing<br>
rand_text (k,g) = let (c, g') = randomR ('a','z') g<br>
in Just (c, ((k-1), g'))<br>
<br>
write_corpus file = bracket (openFile file WriteMode) hClose $ \h -> do<br>
let size = 100000<br>
sequence $ replicate size $ do<br>
g <- newStdGen<br>
let text = gen_string g<br>
TI.hPutStrLn h text<br>
<br>
main = do<br>
putStrLn "generating text corpus"<br>
write_corpus "test.txt"<br>
<br>
<br>
<br>
% cat ext_sort.prof<br>
Wed Oct 17 10:59 2012 Time and Allocation Profiling Report (Final)<br>
<br>
ext_sort +RTS -p -RTS<br>
<br>
total time = 32.56 secs (32558 ticks @ 1000 us, 1 processor)<br>
total alloc = 12,742,917,332 bytes (excludes profiling overheads)<br>
<br>
COST CENTRE MODULE %time %alloc<br>
<br>
gen_string.rand_text.(...) Main 70.7 69.8<br>
gen_string Main 17.6 15.8<br>
gen_string.rand_text Main 5.4 13.3<br>
write_corpus.\ Main 4.3 0.8<br>
<br>
<br>
individual inherited<br>
COST CENTRE MODULE no. entries %time %alloc %time %alloc<br>
<br>
MAIN MAIN 67 0 0.0 0.0 100.0 100.0<br>
main Main 135 0 0.0 0.0 100.0 100.0<br>
write_corpus Main 137 0 0.0 0.0 100.0 100.0<br>
write_corpus.\ Main 138 1 4.3 0.8 100.0 100.0<br>
write_corpus.\.text Main 140 100000 0.0 0.0 95.7 99.2<br>
gen_string Main 141 100000 17.6 15.8 95.7 99.2<br>
gen_string.g' Main 147 100000 0.0 0.0 0.0 0.0<br>
gen_string.rand_text Main 144 25109743 5.4 13.3 77.5 83.2<br>
gen_string.rand_text.g' Main 148 24909743 0.6 0.0 0.6 0.0<br>
gen_string.rand_text.(...) Main 146 25009743 70.7 69.8 70.7 69.8<br>
gen_string.rand_text.c Main 145 25009743 0.8 0.0 0.8 0.0<br>
gen_string.len Main 143 100000 0.0 0.0 0.0 0.0<br>
gen_string.(...) Main 142 100000 0.6 0.3 0.6 0.3<br>
<br>
______________________________<u></u>_________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/<u></u>mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Gregory Collins <<a href="mailto:greg@gregorycollins.net" target="_blank">greg@gregorycollins.net</a>><br>