@@ -1,10 +1,11 @@
1−{-# LANGUAGE MagicHash #-}
1+{-# LANGUAGE GADTs, MagicHash #-}
22
33import qualified Data.ByteString.Char8 as BS
44import qualified Data.ByteString.Lazy.Char8 as BL
55import qualified Data.ByteString.Lazy.Internal as BL
66import Control.Exception (evaluate)
77import Control.DeepSeq (NFData(..))
8+import Control.Parallel.Strategies
89import Criterion.Main
910import Data.Char
1011import qualified Codec.Binary.UTF8.Generic as UTF8
@@ -30,6 +31,12 @@ instance NFData BL.ByteString where
3031 rnf BL.Empty = ()
3132 rnf (BL.Chunk _ ts) = rnf ts
3233
34+data B where
35+ B :: NFData a => a -> B
36+
37+instance NFData B where
38+ rnf (B b) = rnf b
39+
3340main = do
3441 bsa <- BS.readFile "text/test/russian.txt"
3542 let tsa = decodeUtf8 bsa
@@ -40,18 +47,21 @@ main = do
4047 bla = BL.fromChunks (chunksOf 16376 bsa)
4148 blb = BL.fromChunks (chunksOf 16376 bsb)
4249 bsa_len = BS.length bsa
43− tsa_len = TS.length tsa
50+ tsa_len = TS.length tsa
4451 bla_len = BL.length bla
4552 tla_len = TL.length tla
46− la = UTF8.toString bsa
53+ la = UTF8.toString bsa
4754 la_len = L.length la
48− tsb_len = TS.length tsb
49− lb = TS.unpack tsb
50− bsl = BS.lines bsa
51− bll = BL.lines bla
52− tsl = TS.lines tsa
53− tll = TL.lines tla
54− ll = L.lines la
55+ tsb_len = TS.length tsb
56+ lb = TS.unpack tsb
57+ bsl = BS.lines bsa
58+ bll = BL.lines bla
59+ tsl = TS.lines tsa
60+ tll = TL.lines tla
61+ ll = L.lines la
62+ evaluate (rnf [B tsa, B tsb, B tla, B tlb, B bsa, B bsb, B bla, B blb,
63+ B bsa_len, B tsa_len, B bla_len, B tla_len, B la, B la_len,
64+ B tsb_len, B lb, B bsl, B bll, B tsl, B tll, B ll])
5565 defaultMainWith myConfig [
5666 bgroup "append" [
5767 bench "ts" $ nf (TS.append tsb) tsa
@@ -137,32 +147,44 @@ main = do
137147 ],
138148 bgroup "map" [
139149 bench "ts" $ nf (TS.map f) tsa
150+ , bench "tl" $ nf (TL.map f) tla
140151 , bench "bs" $ nf (BS.map f) bsa
152+ , bench "bl" $ nf (BL.map f) bla
141153 , bench "l" $ nf (L.map f) la
142154 ],
143155 bgroup "2map" [
144156 bench "ts" $ nf (TS.map f . TS.map f) tsa
157+ , bench "tl" $ nf (TL.map f . TL.map f) tla
145158 , bench "bs" $ nf (BS.map f . BS.map f) bsa
159+ , bench "bl" $ nf (BL.map f . BL.map f) bla
146160 , bench "l" $ nf (L.map f . L.map f) la
147161 ],
148162 bgroup "reverse" [
149163 bench "ts" $ nf TS.reverse tsa
164+ , bench "tl" $ nf TL.reverse tla
150165 , bench "bs" $ nf BS.reverse bsa
166+ , bench "bl" $ nf BL.reverse bla
151167 , bench "l" $ nf L.reverse la
152168 ],
153169 bgroup "take" [
154170 bench "ts" $ nf (TS.take (tsa_len `div` 3)) tsa
171+ , bench "tl" $ nf (TL.take (tla_len `div` 3)) tla
155172 , bench "bs" $ nf (BS.take (bsa_len `div` 3)) bsa
173+ , bench "bl" $ nf (BL.take (bla_len `div` 3)) bla
156174 , bench "l" $ nf (L.take (la_len `div` 3)) la
157175 ],
158176 bgroup "words" [
159177 bench "ts" $ nf TS.words tsa
178+ , bench "tl" $ nf TL.words tla
160179 , bench "bs" $ nf BS.words bsa
180+ , bench "bl" $ nf BL.words bla
161181 , bench "l" $ nf L.words la
162182 ],
163183 bgroup "zipWith" [
164184 bench "ts" $ nf (TS.zipWith min tsb) tsa
185+ , bench "tl" $ nf (TL.zipWith min tlb) tla
165186 , bench "bs" $ nf (BS.zipWith min bsb) bsa
187+ , bench "bl" $ nf (BL.zipWith min blb) bla
166188 , bench "l" $ nf (L.zipWith min lb) la
167189 ],
168190 bgroup "length" [