I took your Haskell program as a base and have refactored it into a version that is about the same speed as your original C++ program. Will follow up with details when I have a little more time.
This time I have tried fasta benchmark since current entries does notdisplay correct output.Program is copy of mine http://benchmarksgame.alioth.debian.org/u64q/program.php?test=fasta&lang=gpp&id=1c++ benchmark, but unfortunately executes more than twice time.Seems to me that culprit is in function random as I have tested rest of codeand didn't found speed related problems.bmaxa@maxa:~/shootout/fasta$ time ./fastahs 25000000 > /dev/nullreal 0m5.262suser 0m5.228ssys 0m0.020sbmaxa@maxa:~/shootout/fasta$ time ./fastacpp 25000000 > /dev/nullreal 0m2.075suser 0m2.056ssys 0m0.012sSince I am planning to contribute program, perhaps someone cansee a problem to speed it up at least around 3.5 secs which isspeed of bench that display incorrect result (in 7.6.1).Program follows:{-# LANGUAGE BangPatterns #-}{- The Computer Language Benchmarks Gamecontributed by Branimir Maksimovic-}import System.Environmentimport System.IO.Unsafeimport Data.IORefimport Data.Array.Unboxedimport Data.Array.Storableimport Data.Array.Baseimport Data.Wordimport Foreign.Ptrimport Foreign.C.Typestype A = UArray Int Word8type B = StorableArray Int Word8type C = (UArray Int Word8,UArray Int Double)foreign import ccall unsafe "stdio.h"puts :: Ptr a -> IO ()foreign import ccall unsafe "string.h"strlen :: Ptr a -> IO CIntmain :: IO ()main = don <- getArgs >>= readIO.headlet !a = (listArray (0,(length alu)-1)$ map (fromIntegral. fromEnum) alu:: A)make "ONE" "Homo sapiens alu" (n*2) $ Main.repeat a (length alu)make "TWO" "IUB ambiguity codes" (n*3) $ random iubmake "THREE" "Homo sapiens frequency" (n*5) $ random homosapiensmake :: String -> String -> Int -> IO Word8 -> IO (){-# INLINE make #-}make id desc n f = dolet lst = ">" ++ id ++ " " ++ desca <- (newListArray (0,length lst)$ map (fromIntegral. fromEnum) lst:: IO B)unsafeWrite a (length lst) 0pr amake' n 0wheremake' :: Int -> Int -> IO ()make' !n !i = dolet line = (unsafePerformIO $newArray (0,60) 0 :: B)if n > 0then do!c <- funsafeWrite line i cif i+1 >= 60then dopr linemake' (n-1) 0elsemake' (n-1) (i+1)else dounsafeWrite line i 0l <- len lineif l /= 0then pr lineelse return ()pr :: B -> IO ()pr line = withStorableArray line (\ptr -> puts ptr)len :: B -> IO CIntlen line = withStorableArray line (\ptr -> strlen ptr)repeat :: A -> Int -> IO Word8repeat xs !n = dolet v = unsafePerformIO $ newIORef 0!i <- readIORef vif i+1 >= nthen writeIORef v 0else writeIORef v (i+1)return $ xs `unsafeAt` irandom :: C -> IO Word8random (a,b) = do!rnd <- randletfind :: Int -> IO Word8find !i =let!c = a `unsafeAt` i!p = b `unsafeAt` iin if p >= rndthen return celse find (i+1)find 0rand :: IO Double{-# INLINE rand #-}rand = do!seed <- readIORef lastletnewseed = (seed * ia + ic) `rem` imnewran = fromIntegral newseed * rimdrimd = 1.0 / (fromIntegral im)im, ia, ic :: Intim = 139968ia = 3877ic = 29573writeIORef last newseedreturn newranwherelast = unsafePerformIO $ newIORef 42alu :: [Char]alu ="GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG\\GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA\\CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT\\ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA\\GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG\\AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC\\AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"mkCum :: [(Char,Double)] -> [(Word8,Double)]mkCum lst = map (\(c,p) -> ((fromIntegral.fromEnum) c,p)) $scanl1 (\(_,p) (c',p') -> (c', p+p')) lsthomosapiens, iub :: Ciub' = mkCum [('a',0.27),('c',0.12),('g',0.12),('t',0.27),('B',0.02),('D',0.02),('H',0.02),('K',0.02),('M',0.02),('N',0.02),('R',0.02),('S',0.02),('V',0.02),('W',0.02),('Y',0.02)]homosapiens' = mkCum [('a',0.3029549426680),('c',0.1979883004921),('g',0.1975473066391),('t',0.3015094502008)]iub = (listArray (0, (length iub')-1) $ map fst iub',listArray (0, (length iub')-1) $ map snd iub')homosapiens = (listArray (0, (length homosapiens')-1) $ map fst homosapiens',listArray (0, (length homosapiens')-1) $ map snd homosapiens')
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe