@@ -1,12 +1,12 @@
1−-- | Take the first 100 lines from the file, and count the number of lines equal
1+-- | Compare a string with a copy of itself that is identical except
2−-- to those lines
2+-- for the last character.
4module Data.Text.Benchmarks.Equality
4module Data.Text.Benchmarks.Equality
5− ( benchmark
6+ benchmark
8−import Control.Exception (evaluate)
9−import Criterion (Benchmark, bgroup, bench)
9+import Criterion (Benchmark, bgroup, bench, whnf)
10import qualified Data.ByteString.Char8 as B
10import qualified Data.ByteString.Char8 as B
11import qualified Data.ByteString.Lazy.Char8 as BL
11import qualified Data.ByteString.Lazy.Char8 as BL
12import qualified Data.Text as T
12import qualified Data.Text as T
@@ -15,20 +15,16 @@ import qualified Data.Text.Lazy as TL
15import qualified Data.Text.Lazy.Encoding as TL
15import qualified Data.Text.Lazy.Encoding as TL
17benchmark :: FilePath -> IO Benchmark
17benchmark :: FilePath -> IO Benchmark
22+ let t = T.decodeUtf8 b
23+ tl = TL.decodeUtf8 bl
18−benchmark fp = return $ bgroup "Equality"
24+ return $ bgroup "Equality"
19− [ bench "Text" $
25+ [ bench "Text" $ whnf (== T.init t `T.snoc` '\xfffd') t
20− B.readFile fp >>= evaluate . func . T.lines . T.decodeUtf8
21− , bench "LazyText" $
26+ , bench "LazyText" $ whnf (== TL.init tl `TL.snoc` '\xfffd') tl
22− BL.readFile fp >>= evaluate . func . TL.lines . TL.decodeUtf8
23− , bench "ByteString" $
27+ , bench "ByteString" $ whnf (== B.init b `B.snoc` '\xfffd') b
24− B.readFile fp >>= evaluate . func . B.lines
25− , bench "LazyByteString" $
28+ , bench "LazyByteString" $ whnf (== BL.init bl `BL.snoc` '\xfffd') bl
26− BL.readFile fp >>= evaluate . func . BL.lines
27− , bench "String" $
29+ , bench "String" $ whnf (== init l ++ "\xfffd") l
28− readFile fp >>= evaluate . func . lines
31−-- | Frequency of most-appearing line (from the first 100 lines)
33−func :: (Eq a) => [a] -> Int
34−func ls = sum . map (\needle -> length . filter (== needle) $ ls) $ take 100 ls