1
1
mirror of https://github.com/aelve/guide.git synced 2024-12-01 20:54:08 +03:00

Add benchmarks

This commit is contained in:
willbasky 2019-08-29 19:47:30 +05:00
parent ba9eee8e53
commit 77ffda6187
5 changed files with 95 additions and 11 deletions

49
back/benchmarks/Main.hs Normal file
View File

@ -0,0 +1,49 @@
-- | Module contains all stuff to migrate from AcidState to Postgres.
module Main
(
main
) where
import Imports
import Gauge
import Hasql.Transaction.Sessions (Mode (..))
import Guide.Database.Queries.Update
import Guide.Database.Queries.Select
import Guide.Types.Core
import Guide.Database.Connection
main :: IO ()
main = do
conn <- connect
defaultMain [databaseBenchmark conn]
where
databaseBenchmark conn =
bgroup
"Database"
[ bench "select" $ nfIO $
runTransactionExceptT conn Read $ selectCategory "category1111"
, bench "updete" $ nfIO $
runTransactionExceptT conn Write $ updateCategory "category1111" update
]
update :: Category -> Category
update = _categoryTitle .~ "title10"
{-
benchmarked Database/select
time 496.1 μs (429.1 μs .. 551.4 μs)
0.932 R² (0.868 R² .. 0.976 R²)
mean 590.7 μs (502.5 μs .. 939.6 μs)
std dev 508.6 μs (51.75 μs .. 1.065 ms)
variance introduced by outliers: 97% (severely inflated)
benchmarked Database/updete
time 497.4 μs (429.4 μs .. 542.0 μs)
0.900 R² (0.825 R² .. 0.948 R²)
mean 1.429 ms (520.2 μs .. 5.048 ms)
std dev 6.175 ms (104.7 μs .. 13.21 ms)
variance introduced by outliers: 98% (severely inflated)
-}

View File

@ -60,6 +60,8 @@ library:
# You don't need to add modules here, all modules will be exposed automatically. # You don't need to add modules here, all modules will be exposed automatically.
# #
# exposed-modules: # exposed-modules:
ghc-options:
- -O
dependencies: dependencies:
- acid-state - acid-state
- aeson - aeson
@ -161,6 +163,7 @@ executables:
# See https://github.com/sol/hpack/issues/182#issuecomment-310434881 for # See https://github.com/sol/hpack/issues/182#issuecomment-310434881 for
# the explanation of the quoting situation here. # the explanation of the quoting situation here.
- '"-with-rtsopts=-T -N"' - '"-with-rtsopts=-T -N"'
- -O
dependencies: dependencies:
- base - base
- guide - guide
@ -197,3 +200,17 @@ tests:
- temporary - temporary
- webdriver - webdriver
- yaml - yaml
benchmarks:
benchmarks:
main: Main.hs
source-dirs: benchmarks
dependencies:
- base <5
- guide
- gauge
- hasql
- hasql-transaction
ghc-options:
- -O

View File

@ -1,3 +1,4 @@
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleInstances #-}
@ -64,20 +65,35 @@ data MarkdownInline = MarkdownInline {
markdownInlineSource :: Text, markdownInlineSource :: Text,
markdownInlineHtml :: ByteString, markdownInlineHtml :: ByteString,
markdownInlineMarkdown :: ![MD.Node] } markdownInlineMarkdown :: ![MD.Node] }
deriving (Generic, Data, Eq) deriving (Generic, Data, Eq, NFData)
data MarkdownBlock = MarkdownBlock { data MarkdownBlock = MarkdownBlock {
markdownBlockSource :: Text, markdownBlockSource :: Text,
markdownBlockHtml :: ByteString, markdownBlockHtml :: ByteString,
markdownBlockMarkdown :: ![MD.Node] } markdownBlockMarkdown :: ![MD.Node] }
deriving (Generic, Data, Eq) deriving (Generic, Data, Eq, NFData)
data MarkdownTree = MarkdownTree { data MarkdownTree = MarkdownTree {
markdownTreeSource :: Text, markdownTreeSource :: Text,
markdownTreeStructure :: !(Document Text ByteString), markdownTreeStructure :: !(Document Text ByteString),
markdownTreeIdPrefix :: Text, markdownTreeIdPrefix :: Text,
markdownTreeTOC :: Forest Heading } markdownTreeTOC :: Forest Heading }
deriving (Generic, Data, Eq) deriving (Generic, Data, Eq, NFData)
deriving instance NFData MD.Node
deriving instance NFData MD.NodeType
deriving instance NFData MD.ListAttributes
deriving instance NFData MD.DelimType
deriving instance NFData MD.ListType
deriving instance NFData MD.PosInfo
deriving instance NFData (WithSource [MD.Node])
deriving instance (NFData b, NFData t) => NFData (Document t b)
deriving instance (NFData b, NFData t) => NFData (Section t b)
deriving instance NFData Heading
-- instance NFData (Node a f) where
-- rnf tree = foldl1 (seq . rnf) tree `seq` rnf (measure tree)
-- rnf = (`seq` ())
-- rnf (Node info nodeType nodes) = Node (rnf info) (rnf nodeType) (map rnf nodes)
-- | Table-of-contents heading -- | Table-of-contents heading
data Heading = Heading data Heading = Heading

View File

@ -1,3 +1,4 @@
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleInstances #-}
@ -63,7 +64,7 @@ For an explanation of deriveSafeCopySorted, see Note [acid-state].
data Trait = Trait { data Trait = Trait {
traitUid :: Uid Trait, traitUid :: Uid Trait,
traitContent :: MarkdownInline } traitContent :: MarkdownInline }
deriving (Show, Generic, Data, Eq) deriving (Show, Generic, Data, Eq, NFData)
deriveSafeCopySorted 4 'extension ''Trait deriveSafeCopySorted 4 'extension ''Trait
makeClassWithLenses ''Trait makeClassWithLenses ''Trait
@ -161,7 +162,7 @@ data ItemSection
= ItemProsConsSection = ItemProsConsSection
| ItemEcosystemSection | ItemEcosystemSection
| ItemNotesSection | ItemNotesSection
deriving (Eq, Ord, Show, Generic, Data) deriving (Eq, Ord, Show, Generic, Data, NFData)
deriveSafeCopySimple 0 'base ''ItemSection deriveSafeCopySimple 0 'base ''ItemSection
@ -203,7 +204,7 @@ data Item = Item {
itemNotes :: MarkdownTree, -- ^ The notes section itemNotes :: MarkdownTree, -- ^ The notes section
itemLink :: Maybe Url -- ^ Link to homepage or something itemLink :: Maybe Url -- ^ Link to homepage or something
} }
deriving (Generic, Data, Eq, Show) deriving (Generic, Data, Eq, Show, NFData)
deriveSafeCopySorted 13 'extension ''Item deriveSafeCopySorted 13 'extension ''Item
makeClassWithLenses ''Item makeClassWithLenses ''Item
@ -267,7 +268,7 @@ data CategoryStatus
= CategoryStub -- ^ “Stub” = just created = CategoryStub -- ^ “Stub” = just created
| CategoryWIP -- ^ “WIP” = work in progress | CategoryWIP -- ^ “WIP” = work in progress
| CategoryFinished -- ^ “Finished” = complete or nearly complete | CategoryFinished -- ^ “Finished” = complete or nearly complete
deriving (Eq, Show, Generic, Data) deriving (Eq, Show, Generic, Data, NFData)
deriveSafeCopySimple 2 'extension ''CategoryStatus deriveSafeCopySimple 2 'extension ''CategoryStatus
@ -324,7 +325,7 @@ data Category = Category {
-- 'ItemNotesSection', then notes will be shown for each item -- 'ItemNotesSection', then notes will be shown for each item
categoryEnabledSections :: Set ItemSection categoryEnabledSections :: Set ItemSection
} }
deriving (Generic, Data, Eq, Show) deriving (Generic, Data, Eq, Show, NFData)
deriveSafeCopySorted 13 'extension ''Category deriveSafeCopySorted 13 'extension ''Category
makeClassWithLenses ''Category makeClassWithLenses ''Category

View File

@ -1,4 +1,5 @@
{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DeriveAnyClass #-}
-- | A type for unique identifiers. -- | A type for unique identifiers.
module Guide.Uid module Guide.Uid
@ -24,7 +25,7 @@ newtype Uid a = Uid {uidToText :: Text}
deriving stock (Generic, Eq, Ord, Data) deriving stock (Generic, Eq, Ord, Data)
deriving newtype deriving newtype
(Read, Show, IsString, Buildable, ToHttpApiData, FromHttpApiData, (Read, Show, IsString, Buildable, ToHttpApiData, FromHttpApiData,
Hashable, ToJSON, FromJSON) Hashable, ToJSON, FromJSON, NFData)
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
-- Instances -- Instances