追記

main = do
  seed <- newStdGen
  timePrint "loop" 0 $ foo seed -- 適当に定義した時間計測関数
  where
    foo seed = seq d $ return () where
      d = foldl' (+) 0 $ take 1000000 $ randomRs (0,127) seed :: Int

このようなコードを書いて
配列アクセス以外のオーバーヘッドを計ってみたところ、

$ ./a.out
loop : 2.28299 sec.

このようになった。
これを考えるとData.Arrayはかなり高速だということがわかる。
100万回で数十ms、1回当たり数十nsなので、
PentiumM1Ghz上で実行していることを考えると数十クロックで
アクセスできていることになる。
反面IOUArrayは数百クロックかかっているようである。