on b339cf8 help sign in
116 lines 3.4 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
55-------------------------------------------------------------------------------
56--
57-------------------------------------------------------------------------------
59main :: IO ()
60main = do
61 (_, cfg, benches) <- parseCLIOpts defaultStreamSize
62 r <- lookupEnv "Benchmark_FileSystem_Handle_InputFile"
63 (small, big) <-
64 case r of
65 Just inFileName -> return (inFileName, inFileName)
66 Nothing -> do
67 -- XXX will this work on windows/msys?
68 let cmd infile size =
69 "mkdir -p " ++ scratchDir
70 ++ "; test -e " ++ infile
71 ++ " || { echo \"creating input file " ++ infile
72 ++ "\" && head -c " ++ show size
73 ++ " </dev/urandom >" ++ infile
74 ++ ";}"
75 runProcess_ (shell (cmd inFileSmall smallFileSize))
76 runProcess_ (shell (cmd inFileBig bigFileSize))
77 return (inFileSmall, inFileBig)
79 putStrLn $ "Using small input file: " ++ small
80 smallHandle <- openFile small ReadMode
82 putStrLn $ "Using big input file: " ++ big
83 bigHandle <- openFile big ReadMode
85 putStrLn $ "Using output file: " ++ outfile
86 outHandle <- openFile outfile WriteMode
87 devNull <- openFile "/dev/null" WriteMode
89 ssize <- fromIntegral <$> getFileSize small
90 bsize <- fromIntegral <$> getFileSize big
92 ref <- newIORef $ RefHandles
93 { smallInH = smallHandle
94 , bigInH = bigHandle
95 , outputH = outHandle
96 }
98 let env = BenchEnv
99 { href = ref
100 , smallSize = ssize
101 , bigSize = bsize
102 , nullH = devNull
103 , smallInFile = small
104 , bigInFile = big
105 }
107 runMode (mode cfg) cfg benches (allBenchmarks env)
109 where
111 allBenchmarks env =
112 [ bgroup (o_1_space_prefix moduleName) $ Prelude.concat
113 [ RO.allBenchmarks env
114 , RW.allBenchmarks env
115 ]
116 ]