packages feed

sqlite-easy-1.1.1.0: bench/Bench.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE StandaloneDeriving #-}

{-# OPTIONS_GHC -fno-warn-orphans #-}

import Criterion.Main as Criterion

import GHC.Generics (Generic)
import Control.DeepSeq (NFData)
import Control.Monad
import Database.Sqlite.Easy


deriving instance NFData  SQLData

data BenchEnv = BenchEnv
  { largeSampleRows :: [[SQLData]]
  , smallSmapleRows :: [[SQLData]]
  } deriving (Generic, NFData)

main :: IO ()
main = defaultMain
  [ env setupEnv $ \ ~(BenchEnv{..}) ->
    bgroup "sqlite-easy-insert" 
        [ bench "1000 rows/individual"     $ insertBench False smallSmapleRows
        , bench "1000 rows/bulk"           $ insertBench True  smallSmapleRows
        , bench "100000 rows/individual"   $ insertBench False largeSampleRows
        , bench "100000 rows/bulk"         $ insertBench True  largeSampleRows
        ]
  ]

setupEnv :: IO BenchEnv
setupEnv =
  pure $ BenchEnv (take 100000 rows) (take 1000 rows)
  where
    rows = cycle
      [ [SQLInteger 42, SQLFloat 3.14152,   SQLText "The quick brown fox jumps over the lazy dog."]
      , [SQLInteger  0, SQLFloat 12.131516, SQLText "If you've got nothing to say, start a band."]
      ]

createTable, insertTable :: SQL
createTable = "CREATE TABLE bench (b_int INTEGER, b_float REAL, b_text TEXT)"
insertTable = "INSERT INTO bench VALUES (?,?,?)"

insertBench :: Bool -> [[SQLData]] -> Benchmarkable
insertBench bulkMode rows = nfIO $
  withDb ":memory:" $ do
    run createTable
    void $ transaction $ if bulkMode
      then insertTable `runWithMany` rows
      else mapM (insertTable `runWith`) rows