packages feed

yi-rope-0.1.0.0: bench/MainBenchmarkSuite.hs

module Main where

import qualified Yi.Rope as R
import qualified Yi.OldRope as O
import Criterion.Main
import qualified Criterion.Main as C
import Control.DeepSeq
import Data.List (foldl')

type Bench a = Input -> Name -> a -> C.Benchmark
type Input = String
type Name = String

benchOnText :: NFData b => a -> String -> (a -> b) -> Benchmark
benchOnText text name f
  = C.bench name
  $ C.nf f text

linesplitbench :: IO ()
linesplitbench = defaultMain
  [
  --   benchOnText longORope "long O.splitAtLine 10" (O.splitAtLine 10)
  -- , benchOnText longRRope "long R.splitAtLine 10" (R.splitAtLine 10)
  -- , benchOnText wideORope "wide O.splitAtLine 10" (O.splitAtLine 10)
  -- , benchOnText wideRRope "wide R.splitAtLine 10" (R.splitAtLine 10)
  -- , benchOnText longORope "long O.splitAtLine 100" (O.splitAtLine 100)
  -- , benchOnText longRRope "long R.splitAtLine 100" (R.splitAtLine 100)
  -- , benchOnText wideORope "wide O.splitAtLine 100" (O.splitAtLine 100)
  -- ,
    benchOnText wideRRope "wide R.splitAtLine 100" (R.splitAtLine 100)
  ]

lengthbench :: IO ()
lengthbench = defaultMain
  [ benchOnText longORope "long O.length" O.length
  , benchOnText longRRope "long R.length" R.length
  , benchOnText wideORope "wide O.length" O.length
  , benchOnText wideRRope "wide R.length" R.length
  ]

main :: IO ()
main = defaultMain
  [ benchOnText longORope "long O.countNewLines" O.countNewLines
  , benchOnText longRRope "long R.countNewLines" R.countNewLines
  , benchOnText wideORope "wide O.countNewLines" O.countNewLines
  , benchOnText wideRRope "wide R.countNewLines" R.countNewLines
  , benchOnText longORope "long O.split \\n" (O.split 10)
  , benchOnText longRRope "long R.split \\n" (R.split 10)
  , benchOnText wideORope "wide O.split \\n" (O.split 10)
  , benchOnText wideRRope "wide R.split \\n" (R.split 10)
  , benchOnText longORope "long O.splitAt 5" (O.splitAt 5)
  , benchOnText longRRope "long R.splitAt 5" (R.splitAt 5)
  , benchOnText wideORope "wide O.splitAt 5" (O.splitAt 5)
  , benchOnText wideRRope "wide R.splitAt 5" (R.splitAt 5)
  , benchOnText longORope "long O.splitAt 700" (O.splitAt 700)
  , benchOnText longRRope "long R.splitAt 700" (R.splitAt 700)
  , benchOnText wideORope "wide O.splitAt 700" (O.splitAt 700)
  , benchOnText wideRRope "wide R.splitAt 700" (R.splitAt 700)
  , benchOnText longORope "long O.splitAtLine 10" (O.splitAtLine 10)
  , benchOnText longRRope "long R.splitAtLine 10" (R.splitAtLine 10)
  , benchOnText wideORope "wide O.splitAtLine 10" (O.splitAtLine 10)
  , benchOnText wideRRope "wide R.splitAtLine 10" (R.splitAtLine 10)
  , benchOnText longORope "long O.splitAtLine 100" (O.splitAtLine 100)
  , benchOnText longRRope "long R.splitAtLine 100" (R.splitAtLine 100)
  , benchOnText wideORope "wide O.splitAtLine 100" (O.splitAtLine 100)
  , benchOnText wideRRope "wide R.splitAtLine 100" (R.splitAtLine 100)
  , benchOnText longORope "long O.drop 5" (O.drop 5)
  , benchOnText longRRope "long R.drop 5" (R.drop 5)
  , benchOnText wideORope "wide O.drop 5" (O.drop 5)
  , benchOnText wideRRope "wide R.drop 5" (R.drop 5)
  , benchOnText longORope "long O.drop 150" (O.drop 150)
  , benchOnText longRRope "long R.drop 150" (R.drop 150)
  , benchOnText wideORope "wide O.drop 150" (O.drop 150)
  , benchOnText wideRRope "wide R.drop 150" (R.drop 150)
  , benchOnText longORope "long O.take 5" (O.take 5)
  , benchOnText longRRope "long R.take 5" (R.take 5)
  , benchOnText wideORope "wide O.take 5" (O.take 5)
  , benchOnText wideRRope "wide R.take 5" (R.take 5)
  , benchOnText longORope "long O.take 150" (O.take 150)
  , benchOnText longRRope "long R.take 150" (R.take 150)
  , benchOnText wideORope "wide O.take 150" (O.take 150)
  , benchOnText wideRRope "wide R.take 150" (R.take 150)
  , benchOnText longORope "long O.toReverseString" O.toReverseString
  , benchOnText longRRope "long R.toReverseString" R.toReverseString
  , benchOnText wideORope "wide O.toReverseString" O.toReverseString
  , benchOnText wideRRope "wide R.toReverseString" R.toReverseString
  , benchOnText longORope "long O.toString" O.toString
  , benchOnText longRRope "long R.toString" R.toString
  , benchOnText wideORope "wide O.toString" O.toString
  , benchOnText wideRRope "wide R.toString" R.toString
  , benchOnText longORope "long O.null" O.null
  , benchOnText longRRope "long R.null" R.null
  , benchOnText wideORope "wide O.null" O.null
  , benchOnText wideRRope "wide R.null" R.null
  , benchOnText longORope "long O.empty" (const O.empty)
  , benchOnText longRRope "long R.empty" (const R.empty)
  , benchOnText wideORope "wide O.empty" (const O.empty)
  , benchOnText wideRRope "wide R.empty" (const R.empty)
  , benchOnText longORope "long O.length" O.length
  , benchOnText longRRope "long R.length" R.length
  , benchOnText wideORope "wide O.length" O.length
  , benchOnText wideRRope "wide R.length" R.length
  , benchOnText longORope "long O.reverse" O.reverse
  , benchOnText longRRope "long R.reverse" R.reverse
  , benchOnText wideORope "wide O.reverse" O.reverse
  , benchOnText wideRRope "wide R.reverse" R.reverse
  , benchOnText longORope "long O.append" (\x -> O.append x x)
  , benchOnText longRRope "long R.append" (\x -> R.append x x)
  , benchOnText wideORope "wide O.append" (\x -> O.append x x)
  , benchOnText wideRRope "wide R.append" (\x -> R.append x x)
  , benchOnText longORope "long O.concat 10" (\x -> O.concat (replicate 10 x))
  , benchOnText longRRope "long R.concat 10" (\x -> R.concat (replicate 10 x))
  , benchOnText wideORope "wide O.concat 10" (\x -> O.concat (replicate 10 x))
  , benchOnText wideRRope "wide R.concat 10" (\x -> R.concat (replicate 10 x))
  , benchOnText longORope "long O.concat 100" (\x -> O.concat (replicate 100 x))
  , benchOnText longRRope "long R.concat 100" (\x -> R.concat (replicate 100 x))
  , benchOnText wideORope "wide O.concat 100" (\x -> O.concat (replicate 100 x))
  , benchOnText wideRRope "wide R.concat 100" (\x -> R.concat (replicate 100 x))
  ]

instance NFData R.Rope where
  rnf r = R.toString r `deepseq` ()

instance NFData O.Rope where
  rnf r = O.toString r `deepseq` ()

longText :: String
longText = force . unlines
         $ replicate 1000 "Lorem Спасибопожалусто dolor 中文測試 amet"
{-# NOINLINE longText #-}

longRRope :: R.Rope
longRRope = force (R.fromString longText)
{-# NOINLINE longRRope #-}

longORope :: O.Rope
longORope = force (O.fromString longText)
{-# NOINLINE longORope #-}

wideText :: String
wideText = force . unlines
         $ replicate 10 . concat
         $ replicate 100 "Lorem Спасибопожалусто dolor 中文測試 amet "
{-# NOINLINE wideText #-}

wideORope :: O.Rope
wideORope = force (O.fromString wideText)
{-# NOINLINE wideORope #-}

wideRRope :: R.Rope
wideRRope = force (R.fromString wideText)
{-# NOINLINE wideRRope #-}