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