1{-# OPTIONS_GHC -Wno-deprecations #-}
4-- Module : Streamly.Benchmark.FileSystem.Handle
5-- Copyright : (c) 2019 Composewell Technologies
6-- License : BSD3-3-Clause
7-- Maintainer : streamly@composewell.com
8-- Stability : experimental
12{-# LANGUAGE ScopedTypeVariables #-}
14#ifdef __HADDOCK_VERSION__
19{-# LANGUAGE TemplateHaskell #-}
20{-# OPTIONS_GHC -fplugin Test.Inspection.Plugin #-}
23module Handle.ReadWrite
27import System.IO (Handle)
28import Prelude hiding (last, length)
29import Streamly.Internal.System.IO (defaultChunkSize)
31import qualified Streamly.FileSystem.Handle as FH
32import qualified Streamly.Internal.Data.Unfold as IUF
33import qualified Streamly.Internal.FileSystem.Handle as IFH
34import qualified Streamly.Data.Array as A
35import qualified Streamly.Data.Stream.Prelude as S
37import Test.Tasty.Bench hiding (env)
38import Streamly.Benchmark.Common.Handle
41import Streamly.Internal.Data.Stream (Step(..))
43import qualified Streamly.Internal.Data.Stream as D
44import qualified Streamly.Internal.Data.Tuple.Strict as Strict
45import qualified Streamly.Internal.Data.MutArray as MutArray
50-------------------------------------------------------------------------------
52-------------------------------------------------------------------------------
55copyChunks :: Handle -> Handle -> IO ()
56copyChunks inh outh = S.fold (IFH.writeChunks outh) $ IFH.readChunks inh
59inspect $ hasNoTypeClasses 'copyChunks
60inspect $ 'copyChunks `hasNoType` ''Step
63o_1_space_copy_chunked :: BenchEnv -> [Benchmark]
64o_1_space_copy_chunked env =
65 [ bgroup "copy/getChunks"
66 [ mkBench "toNull" env $ \inH _ ->
67 copyChunks inH (nullH env)
68 , mkBench "raw" env $ \inH outH ->
73-------------------------------------------------------------------------------
75-------------------------------------------------------------------------------
78copyStream :: Handle -> Handle -> IO ()
79copyStream inh outh = S.fold (FH.write outh) (S.unfold FH.reader inh)
82inspect $ hasNoTypeClasses 'copyStream
83inspect $ 'copyStream `hasNoType` ''Step -- S.unfold
84inspect $ 'copyStream `hasNoType` ''IUF.ConcatState -- FH.read/UF.many
85inspect $ 'copyStream `hasNoType` ''MutArray.ArrayUnsafe -- FH.write/writeNUnsafe
87inspect $ 'copyStream `hasNoType` ''Strict.Tuple3' -- FH.write/chunksOf
90o_1_space_copy_read :: BenchEnv -> [Benchmark]
91o_1_space_copy_read env =
93 [ mkBench "rawToNull" env $ \inh _ ->
94 copyStream inh (nullH env)
95 , mkBench "rawToFile" env $ \inh outh ->
100-------------------------------------------------------------------------------
102-------------------------------------------------------------------------------
104-- | Send the file contents to /dev/null
105readFromBytesNull :: Handle -> Handle -> IO ()
106readFromBytesNull inh devNull = IFH.putBytes devNull $ S.unfold FH.reader inh
109inspect $ hasNoTypeClasses 'readFromBytesNull
110inspect $ 'readFromBytesNull `hasNoType` ''Step
111inspect $ 'readFromBytesNull `hasNoType` ''MutArray.SpliceState
112inspect $ 'readFromBytesNull `hasNoType` ''MutArray.ArrayUnsafe -- FH.fromBytes/S.chunksOf
113inspect $ 'readFromBytesNull `hasNoType` ''D.FoldMany
116-- | Send the file contents ('defaultChunkSize') to /dev/null
117readWithFromBytesNull :: Handle -> Handle -> IO ()
118readWithFromBytesNull inh devNull =
120 $ S.unfold FH.readerWith (defaultChunkSize, inh)
123inspect $ hasNoTypeClasses 'readWithFromBytesNull
124inspect $ 'readWithFromBytesNull `hasNoType` ''Step
125inspect $ 'readWithFromBytesNull `hasNoType` ''MutArray.SpliceState
126inspect $ 'readWithFromBytesNull `hasNoType` ''MutArray.ArrayUnsafe -- FH.fromBytes/S.chunksOf
127inspect $ 'readWithFromBytesNull `hasNoType` ''D.FoldMany
130-- | Send the chunk content ('defaultChunkSize') to /dev/null
131-- Implicitly benchmarked via 'readFromBytesNull'
132_readChunks :: Handle -> Handle -> IO ()
133_readChunks inh devNull = IUF.fold fld unf inh
137 fld = FH.write devNull
138 unf = IUF.many A.reader FH.chunkReader
140-- | Send the chunk content to /dev/null
141-- Implicitly benchmarked via 'readWithFromBytesNull'
142_readChunksWith :: Handle -> Handle -> IO ()
143_readChunksWith inh devNull = IUF.fold fld unf (defaultChunkSize, inh)
147 fld = FH.write devNull
148 unf = IUF.many A.reader FH.chunkReaderWith
150o_1_space_copy_fromBytes :: BenchEnv -> [Benchmark]
151o_1_space_copy_fromBytes env =
152 [ bgroup "copy/putBytes"
153 [ mkBench "rawToNull" env $ \inh _ ->
154 readFromBytesNull inh (nullH env)
155 , mkBench "FH.readWith" env $ \inh _ ->
156 readWithFromBytesNull inh (nullH env)
160-- | Send the file contents ('defaultChunkSize') to /dev/null
161writeReadWith :: Handle -> Handle -> IO ()
162writeReadWith inh devNull = IUF.fold fld unf (defaultChunkSize, inh)
166 fld = FH.writeWith defaultChunkSize devNull
170inspect $ hasNoTypeClasses 'writeReadWith
171inspect $ 'writeReadWith `hasNoType` ''Step
172inspect $ 'writeReadWith `hasNoType` ''IUF.ConcatState -- FH.read/UF.many
173inspect $ 'writeReadWith `hasNoType` ''MutArray.ArrayUnsafe -- FH.write/writeNUnsafe
177-- | Send the file contents ('AT.defaultChunkSize') to /dev/null
178writeRead :: Handle -> Handle -> IO ()
179writeRead inh devNull = IUF.fold fld unf inh
183 fld = FH.write devNull
187inspect $ hasNoTypeClasses 'writeRead
188inspect $ 'writeRead `hasNoType` ''Step
189inspect $ 'writeRead `hasNoType` ''IUF.ConcatState -- FH.read/UF.many
190inspect $ 'writeRead `hasNoType` ''MutArray.ArrayUnsafe -- FH.write/writeNUnsafe
194o_1_space_copy :: BenchEnv -> [Benchmark]
197 [ mkBench "FH.write . FH.read" env $ \inh _ ->
198 writeRead inh (nullH env)
199 , mkBench "FH.writeWith . FH.readWith" env $ \inh _ ->
200 writeReadWith inh (nullH env)
204-------------------------------------------------------------------------------
206-------------------------------------------------------------------------------
208allBenchmarks :: BenchEnv -> [Benchmark]
209allBenchmarks env = Prelude.concat
210 [ o_1_space_copy_chunked env
211 , o_1_space_copy_read env
212 , o_1_space_copy_fromBytes env
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list