packages feed

levenshtein-0.2.0.0: bench/levenshtein-bench.hs

{-# OPTIONS -fno-warn-orphans #-}
module Main (main) where

import Control.Exception(evaluate)
import Control.DeepSeq (rnf)

import Criterion.Main(bench, bgroup, defaultMain, nf)

import Data.Foldable.Levenshtein(levenshteinDistance)

smallA :: [Int]
smallB :: [Int]

smallA = [0, 5 .. 100]
smallB = [0, 3 .. 72]

bigA :: [Int]
bigA = [0, 5 .. 10000]

bigB :: [Int]
bigB = [0, 3 .. 7200]

levInt :: ([Int], [Int]) -> Int
levInt = uncurry levenshteinDistance

main :: IO ()
main = do
  evaluate (rnf smallA)
  evaluate (rnf smallB)

  evaluate (rnf bigA)
  evaluate (rnf bigB)

  defaultMain
    [ bgroup "same"
      [ bgroup "small"
        [ bench "lib" $ (nf levInt) (smallA, smallA)
        , bench "lib" $ (nf levInt) (smallB, smallB)
        ]
      , bgroup "big"
        [ bench "lib" $ (nf levInt) (bigA, bigA)
        , bench "lib" $ (nf levInt) (bigB, bigB)
        ]
      ]
    , bgroup "different"
      [ bgroup "small"
        [ bench "lib" $ (nf levInt) (smallA, smallB)
        , bench "lib" $ (nf levInt) (smallB, smallA)
        ]
      , bgroup "mixed"
        [ bench "lib" $ (nf levInt) (smallA, bigB)
        , bench "lib" $ (nf levInt) (bigB, smallA)
        , bench "lib" $ (nf levInt) (smallA, bigB)
        , bench "lib" $ (nf levInt) (bigB, smallA)
        , bench "lib" $ (nf levInt) (smallB, bigB)
        , bench "lib" $ (nf levInt) (bigB, smallB)
        , bench "lib" $ (nf levInt) (smallB, bigA)
        , bench "lib" $ (nf levInt) (bigA, smallB)
        ]
      , bgroup "big"
        [ bench "lib" $ (nf levInt) (bigA, bigB)
        , bench "lib" $ (nf levInt) (bigB, bigA)
        ]
      ]
    ]