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-}