th.hs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. {-# LANGUAGE TemplateHaskell, QuasiQuotes, OverloadedStrings, TupleSections, ViewPatterns #-}
  2. import Yesod.Routes.TH
  3. import Yesod.Routes.Parse
  4. import THHelper
  5. import Language.Haskell.TH.Syntax
  6. import Criterion.Main
  7. import Data.Text (words)
  8. import Prelude hiding (words)
  9. import Control.DeepSeq
  10. import Yesod.Routes.TH.Simple
  11. import Test.Hspec
  12. import Control.Monad (forM_, unless)
  13. $(do
  14. let (cons, decs) = mkRouteCons $ map (fmap parseType) resources
  15. clause1 <- mkDispatchClause settings resources
  16. clause2 <- mkSimpleDispatchClause settings resources
  17. return $ concat
  18. [ [FunD (mkName "dispatch1") [clause1]]
  19. , [FunD (mkName "dispatch2") [clause2]]
  20. , decs
  21. , [DataD [] (mkName "Route") [] cons [''Show, ''Eq]]
  22. ]
  23. )
  24. instance NFData Route where
  25. rnf HomeR = ()
  26. rnf FooR = ()
  27. rnf (BarR i) = i `seq` ()
  28. rnf BazR = ()
  29. getHomeR :: Maybe Int
  30. getHomeR = Just 1
  31. getFooR :: Maybe Int
  32. getFooR = Just 2
  33. getBarR :: Int -> Maybe Int
  34. getBarR i = Just (i + 3)
  35. getBazR :: Maybe Int
  36. getBazR = Just 4
  37. samples = take 10000 $ cycle
  38. [ words "foo"
  39. , words "foo bar"
  40. , words ""
  41. , words "bar baz"
  42. , words "bar 4"
  43. , words "bar 1234566789"
  44. , words "baz"
  45. , words "baz 4"
  46. , words "something else"
  47. ]
  48. dispatch2a = dispatch2 `asTypeOf` dispatch1
  49. main :: IO ()
  50. main = do
  51. forM_ samples $ \sample ->
  52. unless (dispatch1 True (sample, "GET") == dispatch2a True (sample, "GET"))
  53. (error $ show sample)
  54. defaultMain
  55. [ bench "dispatch1" $ nf (map (dispatch1 True . (, "GET"))) samples
  56. , bench "dispatch2" $ nf (map (dispatch2a True . (, "GET"))) samples
  57. , bench "dispatch1a" $ nf (map (dispatch1 True . (, "GET"))) samples
  58. , bench "dispatch2a" $ nf (map (dispatch2a True . (, "GET"))) samples
  59. ]