packages feed

myers-diff-0.3.0.0: test-lib/TestLib/Benchmarking.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeApplications #-}

module TestLib.Benchmarking (
  testGroup

  , getPairSingleInsert
  , getPairSingleDelete

  , getPairWithEdit

  , PairFn
  ) where

import Control.Monad
import Criterion
import qualified Data.Diff.Myers as VM
import qualified Data.List as L
import Data.String.Interpolate
import Data.Text as T
import qualified Data.Vector.Unboxed as VU
import Test.QuickCheck
import TestLib.Generators
import TestLib.Instances ()

#ifdef DIFF
import qualified Data.Diff.Diff as DD
#endif


-- * Test group

testGroup :: PairFn -> Int -> Int -> Benchmark
testGroup getPair numSamples inputSize =
  env (getPair numSamples inputSize) $ \samples -> do
    bgroup [i|#{inputSize} characters|] [
      bench "myers-diff-vector" $ nf (L.map (\(_, _, _, _, initialVector, finalVector) -> (VM.diffVectors initialVector finalVector))) samples
      , bench "myers-diff-string" $ nf (L.map (\(initialString, finalString, _, _, _, _) -> (VM.diffStrings initialString finalString))) samples
      , bench "myers-diff-text" $ nf (L.map (\(_, _, initialText, finalText, _, _) -> (VM.diffTexts initialText finalText))) samples
#ifdef DIFF
      , bench "Diff" $ nf (L.map (\(initialString, finalString, _, _, _, _) -> (DD.diff initialString finalString))) samples
#endif
      ]

-- * Pair generation

type PairFn = Int -> Int -> IO [(String, String, Text, Text, VU.Vector Char, VU.Vector Char)]

getPairWithEdit :: (Text -> Gen Text) -> PairFn
getPairWithEdit makeEdit numSamples inputSize = do
  replicateM numSamples $ do
    (t1, t2) <- generate ((resize inputSize arbitraryAlphanumericString) >>= (\initial -> (initial, ) <$> makeEdit initial))

    return (T.unpack t1, T.unpack t2
           , t1, t2
           , VM.fastTextToVector t1, VM.fastTextToVector t2
           )

getPairSingleInsert :: PairFn
getPairSingleInsert = getPairWithEdit arbitraryInsertOn

getPairSingleDelete :: PairFn
getPairSingleDelete = getPairWithEdit arbitraryDeleteOn