2016-06-01 03:24:49 +03:00
{- # LANGUAGE DeriveAnyClass, DeriveGeneric, FlexibleInstances, StandaloneDeriving # -}
2016-06-06 22:32:16 +03:00
{- # OPTIONS_GHC - fno - warn - orphans # -}
2016-05-31 16:23:43 +03:00
module Main where
2016-05-31 16:27:00 +03:00
import Criterion.Main
2016-06-06 22:32:38 +03:00
import Data.Function
2016-06-07 00:17:19 +03:00
import Data.List ( genericLength )
2016-05-31 17:37:34 +03:00
import Data.String
2016-06-06 22:32:16 +03:00
import Patch
2016-05-31 16:27:00 +03:00
import Prologue
2016-06-06 22:32:38 +03:00
import SES
2016-06-01 03:24:49 +03:00
import Test.QuickCheck hiding ( Fixed )
2016-10-06 02:17:46 +03:00
import Arguments
import SemanticDiff ( fetchDiffs )
import qualified Renderer as R
import qualified SemanticDiffPar
import System.Directory ( makeAbsolute )
2016-05-31 16:27:00 +03:00
main :: IO ()
2016-05-31 17:53:23 +03:00
main = do
2016-06-07 00:17:37 +03:00
benchmarks <- sequenceA [ generativeBenchmarkWith " ses " 10 arbitrarySESInputs ( uncurry ( ( * ) ` on ` length ) ) ( nf ( uncurry benchmarkSES ) ) ]
2016-10-06 02:17:46 +03:00
defaultMain ( syncAsyncBenchmark : benchmarks )
2016-06-07 00:17:37 +03:00
where arbitrarySESInputs = ( , ) <$> sized ( ` vectorOf ` arbitrary ) <*> sized ( ` vectorOf ` arbitrary )
2016-05-31 17:37:34 +03:00
2016-06-07 00:16:52 +03:00
benchmarkSES :: [ String ] -> [ String ] -> [ Either String ( Patch String ) ]
2016-06-06 22:32:38 +03:00
benchmarkSES as bs = ses compare cost as bs
where compare a b = if a == b then Just ( Left a ) else Nothing
2016-06-07 00:17:19 +03:00
cost = either ( const 0 ) ( sum . fmap genericLength )
2016-06-06 22:32:38 +03:00
2016-06-06 22:32:16 +03:00
instance NFData a => NFData ( Patch a )
2016-05-31 18:47:56 +03:00
-- | Defines a named group of n benchmarks over inputs generated by an `Arbitrary` instance.
-- |
-- | The inputs’ sizes at each iteration are measured by a metric function, which gives the name of the benchmark. This makes it convenient to correlate a benchmark of some function over lists with e.g. input `length`.
2016-05-31 23:01:36 +03:00
generativeBenchmark :: ( Arbitrary a , Show m , Ord m ) => String -> Int -> ( a -> m ) -> ( a -> Benchmarkable ) -> IO Benchmark
2016-06-07 00:15:51 +03:00
generativeBenchmark name n metric benchmark = generativeBenchmarkWith name n arbitrary metric benchmark
generativeBenchmarkWith :: ( Show m , Ord m ) => String -> Int -> Gen a -> ( a -> m ) -> ( a -> Benchmarkable ) -> IO Benchmark
generativeBenchmarkWith name n generator metric benchmark = do
2016-06-07 00:20:00 +03:00
benchmarks <- traverse measure ( take n [ 0 , ( defaultSize ` div ` n ) .. defaultSize ] )
2016-05-31 23:01:36 +03:00
pure $! bgroup name ( snd <$> ( sortOn fst benchmarks ) )
2016-05-31 17:37:34 +03:00
where measure n = do
2016-06-07 00:15:51 +03:00
input <- generate ( resize n generator )
2016-05-31 17:37:34 +03:00
let measurement = metric input
2016-05-31 23:01:36 +03:00
pure $! ( measurement , bench ( show measurement ) ( benchmark input ) )
2016-05-31 18:42:51 +03:00
defaultSize = 100
2016-10-06 02:17:46 +03:00
syncAsyncBenchmark :: Benchmark
syncAsyncBenchmark =
bgroup " async vs par " [
bench " async " . whnfIO $ SemanticDiff . fetchDiffs =<< theArgs ,
bench " par " . whnfIO $ SemanticDiffPar . fetchDiffs =<< theArgs
]
theArgs :: IO Arguments
theArgs = do
jqueryPath <- makeAbsolute " test/repos/jquery "
pure $ args jqueryPath sha1 sha2 files R . Patch
where
sha1 = " 70526981916945dc4093e116a3de61b1777d4718 "
sha2 = " e5ffcb0838c894e26f4ff32dfec162cf624d8d7d "
files = [
" src/manipulation/getAll.js " ,
" src/manipulation/support.js " ,
" src/manipulation/wrapMap.js " ,
" src/offset.js " ,
" test/unit/css.js " ,
" test/unit/deferred.js " ,
" test/unit/deprecated.js " ,
" test/unit/effects.js " ,
" test/unit/event.js " ,
" test/unit/offset.js " ,
" test/unit/wrap.js "
]