Skip to content

Commit

Permalink
Added file write benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
BebeSparkelSparkel committed Apr 25, 2024
1 parent 19725eb commit 7ebc8b9
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 0 deletions.
6 changes: 6 additions & 0 deletions benchmarks/haskell/Benchmarks.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import qualified Benchmarks.DecodeUtf8 as DecodeUtf8
import qualified Benchmarks.EncodeUtf8 as EncodeUtf8
import qualified Benchmarks.Equality as Equality
import qualified Benchmarks.FileRead as FileRead
import qualified Benchmarks.FileWrite as FileWrite
import qualified Benchmarks.FoldLines as FoldLines
import qualified Benchmarks.Micro as Micro
import qualified Benchmarks.Multilang as Multilang
Expand Down Expand Up @@ -59,6 +60,9 @@ main = do
let tf = ("benchmarks/text-test-data" </>)
-- Cannot use envWithCleanup, because there is no instance NFData Handle
(sinkFn, sink) <- mkSink
(fileWriteBenchmarks, fileWriteCleanup) <- FileWrite.mkFileWriteBenchmarks $ do
(fp, h) <- mkSink
return (h, rmSink fp)
defaultMain
[ Builder.benchmark
, Concat.benchmark
Expand All @@ -77,6 +81,7 @@ main = do
]
, env (Equality.initEnv (tf "japanese.txt")) Equality.benchmark
, FileRead.benchmark (tf "russian.txt")
, fileWriteBenchmarks
, FoldLines.benchmark (tf "russian.txt")
, Multilang.benchmark
, bgroup "Pure"
Expand All @@ -102,3 +107,4 @@ main = do
]
]
rmSink sinkFn
fileWriteCleanup
67 changes: 67 additions & 0 deletions benchmarks/haskell/Benchmarks/FileWrite.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
-- | Benchmarks simple file writing
--
-- Tested in this benchmark:
--
-- * Writing a file to the disk
--

{-# LANGUAGE BangPatterns #-}

module Benchmarks.FileWrite
( mkFileWriteBenchmarks
) where

import System.IO
import Data.String (fromString)
import qualified Data.Text.Lazy as LT
import Test.Tasty.Bench (Benchmark, bgroup, bench, nfIO)
import qualified Data.Text.IO as T
import qualified Data.Text.Lazy.IO as LT
import Control.DeepSeq (deepseq)
import Data.Functor ((<&>))

mkFileWriteBenchmarks :: IO (Handle, IO ()) -> IO (Benchmark, IO ())
mkFileWriteBenchmarks mkSinkNRemove = do
let writeDate = LT.cycle $ fromString [minBound..maxBound]
lengths = [0..5] <> [10,20..100] <> [1000,10000,100000]
newlineSelect nl = do
let nlm = NewlineMode nl nl
(!noBufH, noBufRm) <- mkSinkNRemove
hSetBuffering noBufH NoBuffering
hSetNewlineMode noBufH nlm
(!lineBufH, lineBufRm) <- mkSinkNRemove
hSetBuffering lineBufH LineBuffering
hSetNewlineMode lineBufH nlm
(!blockBufH, blockBufRm) <- mkSinkNRemove
hSetBuffering blockBufH $ BlockBuffering Nothing
hSetNewlineMode blockBufH nlm

return
( bgroup ("Newline " <> show nl) $ lengths <&> \n -> let
st = LT.toStrict lt
lt = LT.take n writeDate
in bgroup ("length " <> show n)
[ deepseq st $ bgroup "StrictText"
[ bench "NoBuffering" $ nfIO $ T.hPutStr noBufH st
, bench "LineBuffering" $ nfIO $ T.hPutStr lineBufH st
, bench "BlockBuffering" $ nfIO $ T.hPutStr blockBufH st
]
, deepseq lt $ bgroup "LazyText"
[ bench "NoBuffering" $ nfIO $ LT.hPutStr noBufH lt
, bench "LineBuffering" $ nfIO $ LT.hPutStr lineBufH lt
, bench "BlockBuffering" $ nfIO $ LT.hPutStr blockBufH lt
]
]
, do
noBufRm
lineBufRm
blockBufRm
)

(lfB, lfR) <- newlineSelect LF
(crlfB, crlfR) <- newlineSelect CRLF
return
( bgroup "FileWrite" [lfB, crlfB]
, lfR >> crlfR
)

1 change: 1 addition & 0 deletions text.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ benchmark text-benchmarks
Benchmarks.EncodeUtf8
Benchmarks.Equality
Benchmarks.FileRead
Benchmarks.FileWrite
Benchmarks.FoldLines
Benchmarks.Micro
Benchmarks.Multilang
Expand Down

0 comments on commit 7ebc8b9

Please sign in to comment.