@@ -1,10 +1,11 @@
1−{-# LANGUAGE MagicHash #-}
1+{-# LANGUAGE GADTs, MagicHash #-}
3import qualified Data.ByteString.Char8 as BS
3import qualified Data.ByteString.Char8 as BS
4import qualified Data.ByteString.Lazy.Char8 as BL
4import qualified Data.ByteString.Lazy.Char8 as BL
5import qualified Data.ByteString.Lazy.Internal as BL
5import qualified Data.ByteString.Lazy.Internal as BL
6import Control.Exception (evaluate)
6import Control.Exception (evaluate)
7import Control.DeepSeq (NFData(..))
7import Control.DeepSeq (NFData(..))
8+import Control.Parallel.Strategies
8import Criterion.Main
9import Criterion.Main
9import Data.Char
10import Data.Char
10import qualified Codec.Binary.UTF8.Generic as UTF8
11import qualified Codec.Binary.UTF8.Generic as UTF8
@@ -30,6 +31,12 @@ instance NFData BL.ByteString where
30 rnf BL.Empty = ()
31 rnf BL.Empty = ()
31 rnf (BL.Chunk _ ts) = rnf ts
32 rnf (BL.Chunk _ ts) = rnf ts
35+ B :: NFData a => a -> B
37+instance NFData B where
34 bsa <- BS.readFile "text/test/russian.txt"
41 bsa <- BS.readFile "text/test/russian.txt"
35 let tsa = decodeUtf8 bsa
42 let tsa = decodeUtf8 bsa
@@ -40,18 +47,21 @@ main = do
40 bla = BL.fromChunks (chunksOf 16376 bsa)
47 bla = BL.fromChunks (chunksOf 16376 bsa)
41 blb = BL.fromChunks (chunksOf 16376 bsb)
48 blb = BL.fromChunks (chunksOf 16376 bsb)
42 bsa_len = BS.length bsa
49 bsa_len = BS.length bsa
43− tsa_len = TS.length tsa
50+ tsa_len = TS.length tsa
44 bla_len = BL.length bla
51 bla_len = BL.length bla
45 tla_len = TL.length tla
52 tla_len = TL.length tla
46− la = UTF8.toString bsa
53+ la = UTF8.toString bsa
47 la_len = L.length la
54 la_len = L.length la
48− tsb_len = TS.length tsb
55+ tsb_len = TS.length tsb
49− lb = TS.unpack tsb
56+ lb = TS.unpack tsb
50− bsl = BS.lines bsa
57+ bsl = BS.lines bsa
51− bll = BL.lines bla
58+ bll = BL.lines bla
52− tsl = TS.lines tsa
59+ tsl = TS.lines tsa
53− tll = TL.lines tla
60+ tll = TL.lines tla
54− ll = L.lines la
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])
55 defaultMainWith myConfig [
65 defaultMainWith myConfig [
56 bgroup "append" [
66 bgroup "append" [
57 bench "ts" $ nf (TS.append tsb) tsa
67 bench "ts" $ nf (TS.append tsb) tsa
@@ -137,32 +147,44 @@ main = do
138 bgroup "map" [
148 bgroup "map" [
139 bench "ts" $ nf (TS.map f) tsa
149 bench "ts" $ nf (TS.map f) tsa
150+ , bench "tl" $ nf (TL.map f) tla
140 , bench "bs" $ nf (BS.map f) bsa
151 , bench "bs" $ nf (BS.map f) bsa
152+ , bench "bl" $ nf (BL.map f) bla
141 , bench "l" $ nf (L.map f) la
153 , bench "l" $ nf (L.map f) la
143 bgroup "2map" [
155 bgroup "2map" [
144 bench "ts" $ nf (TS.map f . TS.map f) tsa
156 bench "ts" $ nf (TS.map f . TS.map f) tsa
157+ , bench "tl" $ nf (TL.map f . TL.map f) tla
145 , bench "bs" $ nf (BS.map f . BS.map f) bsa
158 , bench "bs" $ nf (BS.map f . BS.map f) bsa
159+ , bench "bl" $ nf (BL.map f . BL.map f) bla
146 , bench "l" $ nf (L.map f . L.map f) la
160 , bench "l" $ nf (L.map f . L.map f) la
148 bgroup "reverse" [
162 bgroup "reverse" [
149 bench "ts" $ nf TS.reverse tsa
163 bench "ts" $ nf TS.reverse tsa
164+ , bench "tl" $ nf TL.reverse tla
150 , bench "bs" $ nf BS.reverse bsa
165 , bench "bs" $ nf BS.reverse bsa
166+ , bench "bl" $ nf BL.reverse bla
151 , bench "l" $ nf L.reverse la
167 , bench "l" $ nf L.reverse la
153 bgroup "take" [
169 bgroup "take" [
154 bench "ts" $ nf (TS.take (tsa_len `div` 3)) tsa
170 bench "ts" $ nf (TS.take (tsa_len `div` 3)) tsa
171+ , bench "tl" $ nf (TL.take (tla_len `div` 3)) tla
155 , bench "bs" $ nf (BS.take (bsa_len `div` 3)) bsa
172 , bench "bs" $ nf (BS.take (bsa_len `div` 3)) bsa
173+ , bench "bl" $ nf (BL.take (bla_len `div` 3)) bla
156 , bench "l" $ nf (L.take (la_len `div` 3)) la
174 , bench "l" $ nf (L.take (la_len `div` 3)) la
158 bgroup "words" [
176 bgroup "words" [
159 bench "ts" $ nf TS.words tsa
177 bench "ts" $ nf TS.words tsa
178+ , bench "tl" $ nf TL.words tla
160 , bench "bs" $ nf BS.words bsa
179 , bench "bs" $ nf BS.words bsa
180+ , bench "bl" $ nf BL.words bla
161 , bench "l" $ nf L.words la
181 , bench "l" $ nf L.words la
163 bgroup "zipWith" [
183 bgroup "zipWith" [
164 bench "ts" $ nf (TS.zipWith min tsb) tsa
184 bench "ts" $ nf (TS.zipWith min tsb) tsa
185+ , bench "tl" $ nf (TL.zipWith min tlb) tla
165 , bench "bs" $ nf (BS.zipWith min bsb) bsa
186 , bench "bs" $ nf (BS.zipWith min bsb) bsa
187+ , bench "bl" $ nf (BL.zipWith min blb) bla
166 , bench "l" $ nf (L.zipWith min lb) la
188 , bench "l" $ nf (L.zipWith min lb) la
168 bgroup "length" [
190 bgroup "length" [