I am trying to find out the execution time of mergesort for a list size of 1 million integers. I have done the same in Erlang as well and the execution time in Erlang was around 0.93 seconds. I have implemented the program in almost the same way in Haskell as well but for some reason the Haskell implementation is taking around 12 seconds which doesn't seem right.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE BangPatterns #-}
import Control.Exception
import Formatting
import Formatting.Clock
import System.Clock
import Control.DeepSeq
mergesort [] = []
mergesort [x] = [x]
mergesort xs = let (lhalf, rhalf) = splitAt (length xs `div` 2) xs
in merge' (mergesort lhalf) (mergesort rhalf)
merge' lhalf rhalf = merge lhalf rhalf []
merge [] [] acc = reverse acc
merge [] y acc = reverse acc ++ y
merge x [] acc = reverse acc ++ x
merge (l:ls) (r:rs) acc
| l < r = merge ls (r:rs) (l:acc)
| otherwise = merge rs (l:ls) (r:acc)
toList :: String -> [Integer]
toList input = read ("[" ++ input ++ "]")
main = do
file <- getLine
contents <- readFile file
let !unsortedlist = (toList contents)
start <- getTime Monotonic
evaluate(force (mergesort unsortedlist))
end <- getTime Monotonic
fprint (timeSpecs % "\n") start end
What am I doing wrong?