repos / line-indexed-cursor.hs.git


line-indexed-cursor.hs.git / bench
Evgenii Akentev  ·  2023-07-21

Bench.hs

 1module Main (main) where
 2
 3import Criterion.Main
 4import System.IO
 5import System.Random (randomRs, mkStdGen)
 6
 7import System.IO.LineIndexedCursor
 8
 9main :: IO ()
10main = do
11  -- benchmarked against http://mattmahoney.net/dc/enwik9.zip
12  h <- openFile "test/enwik9" ReadMode
13  c <- mkLineIndexedCursor h
14  defaultMain
15    [ bgroup "LineIndexedCursor"
16      [ bench "" (nfIO $ goToLinesBench c)
17      ]
18    ]
19
20goToLinesBench :: LineIndexedCursor -> IO ()
21goToLinesBench c = do
22  mapM_ (goToLine c) randomOffsets
23
24randomOffsets :: [Integer]
25randomOffsets = take 100 $
26  randomRs (0, 13147025) (mkStdGen 343)
27{-# NOINLINE randomOffsets #-}
28
29
30{-
31Array based results
32
33benchmarking LineIndexedCursor/
34time                 115.8 μs   (115.3 μs .. 116.4 μs)
35                     1.000 R²   (1.000 R² .. 1.000 R²)
36mean                 116.4 μs   (115.9 μs .. 117.0 μs)
37std dev              1.782 μs   (1.510 μs .. 2.271 μs)
38
39Benchmark bench: FINISH
40-}
41
42
43{-
44List based results
45
46benchmarking LineIndexedCursor/
47time                 15.13 s    (9.490 s .. 22.09 s)
48                     0.976 R²   (0.926 R² .. 1.000 R²)
49mean                 20.05 s    (17.70 s .. 23.47 s)
50std dev              3.576 s    (624.5 ms .. 4.685 s)
51variance introduced by outliers: 47% (moderately inflated)
52
53Benchmark bench: FINISH
54-}