File: Micro.hs

package info (click to toggle)
ghc 9.10.3-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 169,076 kB
  • sloc: haskell: 713,554; ansic: 84,184; cpp: 30,255; javascript: 9,003; sh: 7,870; fortran: 3,527; python: 3,228; asm: 2,523; makefile: 2,324; yacc: 1,570; lisp: 532; xml: 196; perl: 111; csh: 2
file content (33 lines) | stat: -rw-r--r-- 1,255 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- | Benchmarks on artificial data. 

module Benchmarks.Micro (benchmark) where

import qualified Data.List.NonEmpty as NE
import qualified Data.Text.Lazy as TL
import qualified Data.Text as T
import Test.Tasty.Bench (Benchmark, Benchmarkable, bgroup, bcompareWithin, bench, nf)

benchmark :: Benchmark
benchmark = bgroup "Micro"
  [ blinear "lazy-inits--last" 500000 2 0.1 $ \len ->
      nf (NE.last . TL.initsNE) (chunks len)
  , blinear "lazy-inits--map-take1" 500000 2 0.1 $ \len ->
      nf (map (TL.take 1) . TL.inits) (chunks len)
  ]

chunks :: Int -> TL.Text
chunks n = TL.fromChunks (replicate n (T.pack "a"))

-- Check that running an action with input length (m * baseLen)
-- runs m times slower than the same action with input length baseLen.
blinear :: String  -- ^ Name (must be globally unique!)
        -> Int     -- ^ Base length
        -> Int     -- ^ Multiplier m
        -> Double  -- ^ Slack s
        -> (Int -> Benchmarkable)  -- ^ Action to measure, parameterized by input length
        -> Benchmark
blinear name baseLen m s run = bgroup name
  [ bench "baseline" $ run baseLen
  , bcompareWithin (fromIntegral m * (1 - s)) (fromIntegral m * (1 + s)) (name ++ ".baseline") $
      bench ("x" ++ show m) $ run (m * baseLen)
  ]