-- |
-- Module : Main
-- Copyright : Joshua Simmons 2017
-- License : BSD3
--
-- Maintainer : joshua.simmons@emptypath.com
--
-- suffix-array benchmarks using criterion
--
module Main
( main
) where
import Criterion.Main
import System.Random (newStdGen, randoms)
import Data.SuffixArray
import Data.SuffixArray.Internal
main :: IO ()
main = do
g <- newStdGen
let rands, sorts, reps :: [Int]
rands = randoms g
sorts = [1..]
reps = concatMap (\x -> replicate x x) [1..]
allDists = [rands, sorts, reps]
defaultMain
[
bgroup "lcp"
[ bench (unwords [show (sz, k), var'])
$ whnf (\(n,a) -> let n' = n `div` length allDists
in var (map (take n' . map (`mod` a)) allDists))
(sz, k)
| k <- [5, 40, 1000]
, sz <- [5000, 35000 .. 215000]
, (var, var') <- [ (naiveLcp, "naiveLcp")
, (justLcp . suffixArray, "suffixArray(lcp)")]
, interesting var' sz k "lcp"
]
,bgroup "single_suffixes"
[ bench (unwords [show (sz, k), dist', var'])
$ whnf (\(n,a) -> var (take n (map (`mod` a) dist))) (sz, k)
| (dist, dist') <- [ (rands, "rands"), (sorts, "sorts")
, (reps, "reps")]
, k <- [5, 40, 1000]
, sz <- [5000, 25000 .. 105000] ++ [200000]
, (var, var') <- [ (naiveOne, "naiveOne")
, (justSuffixes . suffixArrayOne, "suffixArrayOne")]
, interesting var' sz k dist'
]
,bgroup "all_together"
[ bench (unwords [show (sz, k), var'])
$ whnf (\(n,a) -> let n' = n `div` length allDists
in var (map (take n' . map (`mod` a)) allDists))
(sz, k)
| k <- [5, 40, 1000]
, sz <- [5000, 35000 .. 215000]
, (var, var') <- [ (naive, "naive")
, (justSuffixes . suffixArray, "suffixArray")]
, interesting var' sz k "all"
]
]
interesting :: String -> Int -> Int -> String -> Bool
interesting "naiveOne" n _ v
| n > 50000 && v == "sorts" = False
| n > 100000 && v /= "rands" = False
| otherwise = True
interesting "naive" n k _
| k < 40 && n > 60000 = False
| otherwise = True
interesting "naiveLcp" n k _
| k < 40 && n > 65000 = False
| k < 500 && n > 125000 = False
| otherwise = True
interesting _ _ _ _ = True