on c004bd7 help sign in
121 lines 3.5 kB history raw
1-- |
2-- Module : Streamly.Benchmark.FileSystem.Handle
3-- Copyright : (c) 2019 Composewell Technologies
4--
5-- License : BSD3
6-- Maintainer : streamly@composewell.com
7-- Stability : experimental
8-- Portability : GHC
10{-# LANGUAGE CPP #-}
11{-# LANGUAGE ScopedTypeVariables #-}
13#ifdef __HADDOCK_VERSION__
14#undef INSPECTION
15#endif
17#ifdef INSPECTION
18{-# LANGUAGE TemplateHaskell #-}
19{-# OPTIONS_GHC -fplugin Test.Inspection.Plugin #-}
20#endif
22#if __GLASGOW_HASKELL__ >= 800
23import System.Directory (getFileSize)
24#endif
25import System.Environment (lookupEnv)
26import System.IO (openFile, IOMode(..))
27import System.Process.Typed (shell, runProcess_)
28import Prelude hiding (last, length)
30import qualified Handle.ReadWrite as RW
31import qualified Handle.Read as RO
33import Data.IORef
34import Gauge hiding (env)
35import Streamly.Benchmark.Common
36import Handle.Common
38-------------------------------------------------------------------------------
39--
40-------------------------------------------------------------------------------
42moduleName :: String
43moduleName = "FileSystem.Handle"
45-------------------------------------------------------------------------------
46--
47-------------------------------------------------------------------------------
49smallFileSize :: Int
50smallFileSize = 10 * 1024 * 1024
52bigFileSize :: Int
53bigFileSize = 100 * 1024 * 1024
55blockSize :: Int
56blockSize = 32768
58blockCount :: Int -> Int
59blockCount size = (size + blockSize - 1) `div` blockSize
61-------------------------------------------------------------------------------
62--
63-------------------------------------------------------------------------------
65main :: IO ()
66main = do
67 (_, cfg, benches) <- parseCLIOpts defaultStreamSize
68 r <- lookupEnv "Benchmark.FileSystem.Handle.InputFile"
69 (small, big) <-
70 case r of
71 Just inFileName -> return (inFileName, inFileName)
72 Nothing -> do
73 -- XXX will this work on windows/msys?
74 let cmd infile size =
75 "mkdir -p " ++ scratchDir
76 ++ "; test -e " ++ infile
77 ++ " || { echo \"creating input file " ++ infile
78 ++ "\" && dd if=/dev/random of=" ++ infile
79 ++ " bs=" ++ show blockSize
80 ++ " count=" ++ show (blockCount size)
81 ++ ";}"
82 runProcess_ (shell (cmd inFileSmall smallFileSize))
83 runProcess_ (shell (cmd inFileBig bigFileSize))
84 return (inFileSmall, inFileBig)
86 smallHandle <- openFile small ReadMode
87 bigHandle <- openFile big ReadMode
88 outHandle <- openFile outfile WriteMode
89 devNull <- openFile "/dev/null" WriteMode
91#if __GLASGOW_HASKELL__ >= 800
92 ssize <- fromIntegral <$> getFileSize small
93 bsize <- fromIntegral <$> getFileSize big
94#else
95 let ssize = smallFileSize
96 let bsize = bigFileSize
97#endif
99 ref <- newIORef $ RefHandles
100 { smallInH = smallHandle
101 , bigInH = bigHandle
102 , outputH = outHandle
103 }
105 let env = BenchEnv
106 { href = ref
107 , smallSize = ssize
108 , bigSize = bsize
109 , nullH = devNull
110 }
112 runMode (mode cfg) cfg benches (allBenchmarks env)
114 where
116 allBenchmarks env =
117 [ bgroup (o_1_space_prefix moduleName) $ Prelude.concat
118 [ RO.allBenchmarks env
119 , RW.allBenchmarks env
120 ]
121 ]