streamly-0.11.0: benchmark/Streamly/Benchmark/FileSystem/DirIO.hs
-- |
-- Module : Streamly.Benchmark.FileSystem.DirIO
-- Copyright : (c) 2019 Composewell Technologies
-- License : BSD-3-Clause
-- Maintainer : streamly@composewell.com
-- Stability : experimental
-- Portability : GHC
{-# LANGUAGE CPP #-}
module Main (main) where
--------------------------------------------------------------------------------
-- Imports
--------------------------------------------------------------------------------
import Control.Monad (void)
import GHC.IO.Encoding (setLocaleEncoding, utf8)
import Streamly.Benchmark.Common (o_1_space_prefix)
import qualified Streamly.Data.Stream.Prelude as Stream
import qualified Streamly.Data.Fold as Fold
import Prelude hiding (last, length)
import Test.Tasty.Bench
import BenchTestLib.DirIO
--------------------------------------------------------------------------------
-- Main
--------------------------------------------------------------------------------
moduleName :: String
moduleName = "FileSystem.DirIO"
-- | List the current directory recursively
main :: IO ()
main = do
setLocaleEncoding utf8
let smallTree = "benchmark-tmp/dir-structure-small"
bigTree = "benchmark-tmp/dir-structure-big"
void $ createDirStucture smallTree 2 3
void $ createDirStucture bigTree 5 5
defaultMain
[ bgroup (o_1_space_prefix moduleName)
#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
$ bench "listDirByteChunked (big)" (nfIO $
Stream.fold Fold.drain $ listDirByteChunked bigTree) :
#endif
-- NOTE: The BFS traversal fails with:
-- openDirStream: resource exhausted (Too many open files)
-- if a bigger directory tree is used
[ bench "listDirUnfoldDfs (big)" $ nfIO $
Stream.fold Fold.drain $ listDirUnfoldDfs id bigTree
, bench "listDirUnfoldBfs (small)" $ nfIO $
Stream.fold Fold.drain $ listDirUnfoldBfs id smallTree
, bench "listDirUnfoldBfsRev (small)" $ nfIO $
Stream.fold Fold.drain $ listDirUnfoldBfsRev id smallTree
, bench "listDirConcatDfs (big)" $ nfIO $
Stream.fold Fold.drain $ listDirConcatDfs id bigTree
, bench "listDirConcatBfs (small)" $ nfIO $
Stream.fold Fold.drain $ listDirConcatBfs id smallTree
, bench "listDirConcatBfsRev (small)" $ nfIO $
Stream.fold Fold.drain $ listDirConcatBfsRev id smallTree
, bench "listDirAppend (big)" $ nfIO $
Stream.fold Fold.drain $ listDirAppend id bigTree
, bench "listDirInterleave (big)" $ nfIO $
Stream.fold Fold.drain $ listDirInterleave id bigTree
, bench "listDirPar (big)" $ nfIO $
Stream.fold Fold.drain $ listDirPar id bigTree
, bench "listDirParInterleaved (big)" $ nfIO $
Stream.fold Fold.drain $ listDirParInterleaved id bigTree
, bench "listDirParOrdered (big)" $ nfIO $
Stream.fold Fold.drain $ listDirParOrdered id bigTree
, bench "listDirChunkDfs (big)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkDfs id bigTree
, bench "listDirChunkBfs (small)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkBfs id smallTree
, bench "listDirChunkBfsRev (small)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkBfsRev id smallTree
, bench "listDirChunkAppend (big)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkAppend id bigTree
, bench "listDirChunkInterleave (big)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkInterleave id bigTree
, bench "listDirChunkPar (big)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkPar id bigTree
, bench "listDirChunkParInterleaved (big)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkParInterleaved id bigTree
, bench "listDirChunkParOrdered (big)" $ nfIO $
Stream.fold Fold.drain $ listDirChunkParOrdered id bigTree
]
]