packages feed

patches-vector-0.1.5.0: bm/benchmarks.hs

import Criterion.Main
import Data.Patch
import Test.QuickCheck
import Test.QuickCheck.Gen
import Test.QuickCheck.Random
import Debug.Trace
import qualified Data.Vector as Vector
import Data.Vector (Vector)
editsTo :: Arbitrary a => Vector a -> Gen (Edit a)
editsTo v = do
  i <- choose (0, Vector.length v -1)
  c <- elements [const (Insert i), \o _ -> Delete i o, Replace i]
  x <- arbitrary
  return $ c (v Vector.! i) x

patchesFrom' :: (Eq a, Arbitrary a) => Vector a -> Gen (Patch a)
patchesFrom' v | Vector.length v > 0 = fromList <$> listOf (editsTo v)
               | otherwise           = fromList <$> listOf (Insert 0 <$> arbitrary)
patchesFrom :: Vector Int -> Gen (Patch Int)
patchesFrom = patchesFrom'

instance Arbitrary a => Arbitrary (Vector a) where arbitrary = Vector.fromList <$> listOf arbitrary

qcgen :: QCGen
qcgen = mkQCGen 19835315

gen :: Int -> (Patch Int, Vector Int)
gen i = let
          doc = unGen arbitrary qcgen i :: Vector Int
          patch = unGen (patchesFrom doc) qcgen i
        in traceShow (length $ toList patch, length doc) (patch,doc)

main :: IO ()
main =
  defaultMain [ bgroup "apply" [ bench "1" $ nf (uncurry apply) (gen 500)
                               , bench "2" $ nf (uncurry apply) (gen 1000)
                               , bench "3" $ nf (uncurry apply) (gen 2000)
                               , bench "4" $ nf (uncurry apply) (gen 4000)
                               ]
              ]