1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- | Measure time usage by the tar/untar functions.
module Main where
import Conduit
import Control.DeepSeq
import Control.Monad
import Criterion.Main
import Data.ByteString (ByteString)
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import qualified Data.Conduit.List as CL
import qualified Data.Conduit.Tar as Tar
import Data.Conduit.Tar.Types
import Data.Monoid
import GHC.Generics
import System.Posix.Types
main :: IO ()
main =
defaultMain
(concat
[ [ bench
("tar " ++ show count ++ " files")
(nfIO
(runConduitRes
(CL.sourceList files .| void Tar.tar .| CL.sinkNull)))
| count :: Int <- [1, 10, 100, 1000, 10000]
, let !files =
force
(concat
(map
(\i -> makeFileN (S8.pack (show i) <> ".txt") 10)
[1 :: Int .. count]))
]
, [ bench
("tar file of " ++ show bytes ++ " bytes")
(nfIO
(runConduitRes
(CL.sourceList files .| void Tar.tar .| CL.sinkNull)))
| bytes :: Int <- [1, 10, 100, 1000, 10000]
, let !files = force (makeFileN "file.txt" bytes)
]
, [ bench
("untar " ++ show count ++ " files")
(nfIO
(runConduitRes
(CL.sourceList files .| void Tar.tar .|
void (Tar.untar (const (return ()))) .|
CL.sinkNull)))
| count :: Int <- [1, 10, 100, 1000, 10000]
, let !files =
force
(concat
(map
(\i -> makeFileN (S8.pack (show i) <> ".txt") 10)
[1 :: Int .. count]))
]
, [ bench
("untar file of " ++ show bytes ++ " bytes")
(nfIO
(runConduitRes
(CL.sourceList files .| void Tar.tar .|
void (Tar.untar (const (return ()))) .|
CL.sinkNull)))
| bytes :: Int <- [1, 10, 100, 1000, 10000]
, let !files = force (makeFileN "file.txt" bytes)
]
])
----------------------------------------------------------------------
-- Helpers
makeFileN :: ByteString -> Int -> [Either FileInfo ByteString]
makeFileN fname bytes =
let contents = S8.pack (take bytes (cycle "Hello Dave"))
in [ Left
FileInfo
{ filePath = fname
, fileUserId = 0
, fileUserName = "test"
, fileGroupId = 0
, fileGroupName = "test"
, fileMode = 0
, fileSize = fromIntegral (S.length contents)
, fileType = FTNormal
, fileModTime = 1234
}
, Right contents
]
----------------------------------------------------------------------
-- NFData helper instances. If ever these instances become available,
-- these can just be removed.
deriving instance Generic FileInfo
instance NFData FileInfo
deriving instance Generic FileType
instance NFData FileType
deriving instance Generic CUid
instance NFData CUid
deriving instance Generic COff
instance NFData COff
deriving instance Generic CGid
instance NFData CGid
deriving instance Generic CMode
instance NFData CMode
|