module Main (main) where import Criterion.Main import System.IO import System.Random (randomRs, mkStdGen) import System.IO.LineIndexedCursor main :: IO () main = do -- benchmarked against http://mattmahoney.net/dc/enwik9.zip h <- openFile "test/enwik9" ReadMode c <- mkLineIndexedCursor h defaultMain [ bgroup "LineIndexedCursor" [ bench "" (nfIO $ goToLinesBench c) ] ] goToLinesBench :: LineIndexedCursor -> IO () goToLinesBench c = do mapM_ (goToLine c) randomOffsets randomOffsets :: [Integer] randomOffsets = take 100 $ randomRs (0, 13147025) (mkStdGen 343) {-# NOINLINE randomOffsets #-} {- Array based results benchmarking LineIndexedCursor/ time 115.8 μs (115.3 μs .. 116.4 μs) 1.000 R² (1.000 R² .. 1.000 R²) mean 116.4 μs (115.9 μs .. 117.0 μs) std dev 1.782 μs (1.510 μs .. 2.271 μs) Benchmark bench: FINISH -} {- List based results benchmarking LineIndexedCursor/ time 15.13 s (9.490 s .. 22.09 s) 0.976 R² (0.926 R² .. 1.000 R²) mean 20.05 s (17.70 s .. 23.47 s) std dev 3.576 s (624.5 ms .. 4.685 s) variance introduced by outliers: 47% (moderately inflated) Benchmark bench: FINISH -}