mismi-s3-0.0.2: test/bench.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
import Control.Monad.Catch
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Except (ExceptT, runExceptT, mapExceptT)
import Criterion.Main
import qualified Data.Text as T
import Mismi.S3
import qualified Mismi.S3.Unsafe as Unsafe
import P
import System.IO
import System.IO.Error
import System.IO.Temp
import Test.Mismi
import qualified Test.Mismi.S3 as S3
createFiles :: Address -> Int -> AWS ()
createFiles prefix n = do
mapM_ (flip (Unsafe.writeWithMode Overwrite) "data") $ files prefix n
createLargeFiles :: Address -> Int -> AWS ()
createLargeFiles prefix n = do
withSystemTempFile "file" $ \f h -> do
liftIO $ hSetFileSize h (100 * 1024 * 1024 :: Integer) {-- 100 mb --}
liftIO $ hClose h
mapM_ (Unsafe.uploadWithMode Overwrite f) $ files prefix n
files :: Address -> Int -> [Address]
files prefix n =
fmap (\i -> withKey (// Key ("file-" <> (T.pack $ show i))) prefix) [1..n]
run :: AWS a -> IO a
run =
runAWSDefaultRegion
runE :: ExceptT SyncError AWS a -> IO a
runE t =
either (throwM . userError . T.unpack . renderSyncError) pure =<< runExceptT (mapExceptT runAWSDefaultRegion t)
main :: IO ()
main = do
buck <- S3.testBucket
let a = Address buck (Key "s3-benchmarks/small-foo")
b = Address buck (Key "s3-benchmarks/small-bar")
c = Address buck (Key "s3-benchmarks/large-foo")
d = Address buck (Key "s3-benchmarks/large-bar")
o = Address buck (Key "s3-benchmarks/output")
run $ do
createFiles a 100
createFiles b 1000
createLargeFiles c 100
createLargeFiles d 1000
runE $ syncWithMode OverwriteSync b o 100
defaultMain [
bgroup "sync-small-files" [
bench "sem-100-100" (nfIO . runE $ syncWithMode OverwriteSync a o 100)
, bench "sem-100-50" (nfIO . runE $ syncWithMode OverwriteSync a o 50)
, bench "sem-100-20" (nfIO . runE $ syncWithMode OverwriteSync a o 20)
, bench "sem-100-10" (nfIO . runE $ syncWithMode OverwriteSync a o 10)
, bench "sem-100-1" (nfIO . runE $ syncWithMode OverwriteSync a o 1)
, bench "sem-1000-1000" (nfIO . runE $ syncWithMode OverwriteSync b o 1000)
, bench "sem-1000-100" (nfIO . runE $ syncWithMode OverwriteSync b o 100)
, bench "sem-1000-10" (nfIO . runE $ syncWithMode OverwriteSync b o 10)
]
, bgroup "sync-large-files" [
bench "sem-100-100" (nfIO . runE $ syncWithMode OverwriteSync c o 100)
, bench "sem-100-50" (nfIO . runE $ syncWithMode OverwriteSync c o 50)
, bench "sem-100-20" (nfIO . runE $ syncWithMode OverwriteSync c o 20)
, bench "sem-100-10" (nfIO . runE $ syncWithMode OverwriteSync c o 10)
, bench "sem-100-1" (nfIO . runE $ syncWithMode OverwriteSync c o 1)
, bench "sem-1000-1000" (nfIO . runE $ syncWithMode OverwriteSync d o 1000)
, bench "sem-1000-100" (nfIO . runE $ syncWithMode OverwriteSync d o 100)
, bench "sem-1000-10" (nfIO . runE $ syncWithMode OverwriteSync d o 10)
]
]