on master help sign in
WordCount → WordFrequencies, purify and cleanup
636adc4Jasper Van der Jeugt
tests/benchmarks/src/Data/Text/Benchmarks.hs+2−2
@@ -21,7 +21,7 @@ import qualified Data.Text.Benchmarks.Pure as Pure
21import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
21import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
22import qualified Data.Text.Benchmarks.Replace as Replace
22import qualified Data.Text.Benchmarks.Replace as Replace
23import qualified Data.Text.Benchmarks.Search as Search
23import qualified Data.Text.Benchmarks.Search as Search
24−import qualified Data.Text.Benchmarks.WordCount as WordCount
24+import qualified Data.Text.Benchmarks.WordFrequencies as WordFrequencies
25
25
26import qualified Data.Text.Benchmarks.Programs.Cut as Programs.Cut
26import qualified Data.Text.Benchmarks.Programs.Cut as Programs.Cut
27import qualified Data.Text.Benchmarks.Programs.Sort as Programs.Sort
27import qualified Data.Text.Benchmarks.Programs.Sort as Programs.Sort
@@ -50,7 +50,7 @@ benchmarks = do
50 , ReadNumbers.benchmark (tf "numbers.txt")
50 , ReadNumbers.benchmark (tf "numbers.txt")
51 , Replace.benchmark (tf "russian.txt") "принимая" "своем"
51 , Replace.benchmark (tf "russian.txt") "принимая" "своем"
52 , Search.benchmark (tf "russian.txt") "принимая"
52 , Search.benchmark (tf "russian.txt") "принимая"
53− , WordCount.benchmark (tf "russian.txt")
53+ , WordFrequencies.benchmark (tf "russian.txt")
54 ]
54 ]
55
55
56 -- Program-like benchmarks
56 -- Program-like benchmarks
tests/benchmarks/src/Data/Text/Benchmarks/WordCount.hsdeleted−22
@@ -1,22 +0,0 @@
1−-- | A word frequence count program
2−--
3−module Data.Text.Benchmarks.WordCount
4− ( benchmark
5− ) where
6−
7−import Control.Exception (evaluate)
8−import Criterion (Benchmark, bench)
9−import Data.List (foldl')
10−import Data.Map (Map)
11−import qualified Data.Map as M
12−import qualified Data.Text as T
13−import qualified Data.Text.IO as T
14−
15−benchmark :: FilePath -> IO Benchmark
16−benchmark fp = return $ bench "WordCount" $ do
17− t <- T.readFile fp
18− evaluate $ M.size $ wordCount t
19−
20−wordCount :: T.Text -> Map T.Text Int
21−wordCount =
22− foldl' (\m k -> M.insertWith (+) k 1 m) M.empty . map T.toLower . T.words
tests/benchmarks/src/Data/Text/Benchmarks/WordFrequencies.hsnew file+28
@@ -0,0 +1,28 @@
1+-- | A word frequency count using the different string types
2+--
3+module Data.Text.Benchmarks.WordFrequencies
4+ ( benchmark
5+ ) where
6+
7+import Criterion (Benchmark, bench, bgroup, whnf)
8+import Data.Char (toLower)
9+import Data.List (foldl')
10+import Data.Map (Map)
11+import qualified Data.ByteString.Char8 as B
12+import qualified Data.Map as M
13+import qualified Data.Text as T
14+import qualified Data.Text.IO as T
15+
16+benchmark :: FilePath -> IO Benchmark
17+benchmark fp = do
18+ s <- readFile fp
19+ b <- B.readFile fp
20+ t <- T.readFile fp
21+ return $ bgroup "WordFrequencies"
22+ [ bench "String" $ whnf (frequencies . words . map toLower) s
23+ , bench "ByteString" $ whnf (frequencies . B.words . B.map toLower) b
24+ , bench "Text" $ whnf (frequencies . T.words . T.toLower) t
25+ ]
26+
27+frequencies :: Ord a => [a] -> Map a Int
28+frequencies = foldl' (\m k -> M.insertWith (+) k 1 m) M.empty