summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2013-09-29 03:30:48 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2013-09-29 03:30:48 +0400
commite0ad240589038f9cc61a43844067ad021c0a903f (patch)
treec07c7146d5f9330dbc809621f2440ca2622f7b17
parentd60c3c8db9eed770a11fe199bf158a26d9ffecea (diff)
Add bench for big dictionaries
-rw-r--r--bench/Main.hs84
-rw-r--r--bencoding.cabal2
2 files changed, 75 insertions, 11 deletions
diff --git a/bench/Main.hs b/bench/Main.hs
index ef9f08c..1cd2429 100644
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -1,16 +1,20 @@
1{-# LANGUAGE PackageImports #-} 1{-# LANGUAGE PackageImports #-}
2{-# LANGUAGE DeriveGeneric #-} 2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE RecordWildCards #-}
4{-# LANGUAGE OverloadedStrings #-}
3module Main (main) where 5module Main (main) where
4 6
7import Control.Applicative
5import Control.DeepSeq 8import Control.DeepSeq
6import Data.Maybe
7import Data.Attoparsec.ByteString as Atto 9import Data.Attoparsec.ByteString as Atto
8import Data.ByteString as B 10import Data.ByteString as BS
9import Data.ByteString.Lazy as BL 11import qualified Data.ByteString.Lazy as BL
10import Data.List as L 12import Data.List as L
11import Criterion.Main 13import Data.Maybe
14import Data.Monoid
12import System.Environment 15import System.Environment
13 16
17import Criterion.Main
14import GHC.Generics 18import GHC.Generics
15 19
16import "bencode" Data.BEncode as A 20import "bencode" Data.BEncode as A
@@ -51,11 +55,63 @@ replicate' c x
51 go 0 = Nil 55 go 0 = Nil
52 go n = Cons x $ go (pred n) 56 go n = Cons x $ go (pred n)
53 57
58{-----------------------------------------------------------------------
59-- Big dicts
60-----------------------------------------------------------------------}
61
62data Torrent = Torrent {
63 tAnnounce :: !ByteString
64 , tInfo :: !BDict
65 , tAnnounceList :: !(Maybe ByteString)
66 , tComment :: !(Maybe ByteString)
67 , tCreatedBy :: !(Maybe ByteString)
68 , tCreationDate :: !(Maybe ByteString)
69 , tEncoding :: !(Maybe ByteString)
70 , tPublisher :: !(Maybe ByteString)
71 , tPublisherURL :: !(Maybe ByteString)
72 , tSignature :: !(Maybe ByteString)
73 } deriving (Show, Eq)
74
75instance NFData Torrent where
76 rnf Torrent {..} = ()
77
78instance C.BEncode Torrent where
79 toBEncode Torrent {..} = fromAscAssocs
80 [ "announce" --> tAnnounce
81 , "announce-list" -->? tAnnounceList
82 , "comment" -->? tComment
83 , "created by" -->? tCreatedBy
84 , "creation date" -->? tCreationDate
85 , "encoding" -->? tEncoding
86 , "info" --> tInfo
87 , "publisher" -->? tPublisher
88 , "publisher-url" -->? tPublisherURL
89 , "signature" -->? tSignature
90 ]
91
92 fromBEncode (C.BDict d) =
93 Torrent <$> d >-- "announce"
94 <*> d >-- "info"
95 <*> d >--? "announce-list"
96 <*> d >--? "comment"
97 <*> d >--? "created by"
98 <*> d >--? "creation date"
99 <*> d >--? "encoding"
100 <*> d >--? "publisher"
101 <*> d >--? "publisher-url"
102 <*> d >--? "signature"
103
104 fromBEncode _ = decodingError "Torrent"
105
106{-----------------------------------------------------------------------
107-- Main
108-----------------------------------------------------------------------}
109
54main :: IO () 110main :: IO ()
55main = do 111main = do
56 (path : args) <- getArgs 112 (path : args) <- getArgs
57 torrentFile <- B.readFile path 113 torrentFile <- BS.readFile path
58 let lazyTorrentFile = fromChunks [torrentFile] 114 let lazyTorrentFile = BL.fromChunks [torrentFile]
59 115
60 case rnf (torrentFile, lazyTorrentFile) of 116 case rnf (torrentFile, lazyTorrentFile) of
61 () -> return () 117 () -> return ()
@@ -100,11 +156,11 @@ main = do
100 156
101 , let d = BL.toStrict (C.encoded (L.replicate 10000 ())) 157 , let d = BL.toStrict (C.encoded (L.replicate 10000 ()))
102 in d `seq` (bench "list10000unit/bencoding/decode" $ nf 158 in d `seq` (bench "list10000unit/bencoding/decode" $ nf
103 (C.decoded :: B.ByteString -> Either String [()]) d) 159 (C.decoded :: BS.ByteString -> Either String [()]) d)
104 160
105 , let d = BL.toStrict $ C.encoded $ L.replicate 10000 (0 :: Int) 161 , let d = BL.toStrict $ C.encoded $ L.replicate 10000 (0 :: Int)
106 in d `seq` (bench "list10000int/bencoding/decode" $ nf 162 in d `seq` (bench "list10000int/bencoding/decode" $ nf
107 (C.decoded :: B.ByteString -> Either String [Int]) d) 163 (C.decoded :: BS.ByteString -> Either String [Int]) d)
108 164
109 , let d = L.replicate 10000 0 165 , let d = L.replicate 10000 0
110 in bench "list10000int/bencoding/encode>>decode" $ 166 in bench "list10000int/bencoding/encode>>decode" $
@@ -117,4 +173,12 @@ main = do
117 nf (getRight . C.decoded . BL.toStrict . C.encoded 173 nf (getRight . C.decoded . BL.toStrict . C.encoded
118 :: List Int -> List Int) 174 :: List Int -> List Int)
119 d 175 d
176
177 , let Right be = C.decode torrentFile
178 id' x = let t = either error id (fromBEncode x)
179 in toBEncode (t :: Torrent)
180
181 in bench "bigdict" $ nf
182 (appEndo $ mconcat $ L.replicate 1000 (Endo id'))
183 be
120 ] 184 ]
diff --git a/bencoding.cabal b/bencoding.cabal
index b077490..b4cd89f 100644
--- a/bencoding.cabal
+++ b/bencoding.cabal
@@ -76,12 +76,12 @@ benchmark bench-comparison
76 main-is: Main.hs 76 main-is: Main.hs
77 build-depends: base == 4.* 77 build-depends: base == 4.*
78 , ghc-prim 78 , ghc-prim
79 , deepseq
79 80
80 , attoparsec >= 0.10 81 , attoparsec >= 0.10
81 , bytestring >= 0.10.0.2 82 , bytestring >= 0.10.0.2
82 83
83 , criterion 84 , criterion
84 , deepseq
85 85
86 , bencoding 86 , bencoding
87 , bencode >= 0.5 87 , bencode >= 0.5