on master help sign in
WordCount → WordFrequencies, purify and cleanup
commit636adc4d86bd6e0f2d935bca1676d1a5d5a3f512 authorJasper Van der Jeugt <jaspervdj@gmail.com> dateFri 10 Jun 2011, 22:54 (15 years ago) parent60ab2ba
3 files changed+30−24
tests/benchmarks/src/Data/Text/Benchmarks.hs+2−2 tests/benchmarks/src/Data/Text/Benchmarks/WordCount.hs−22 tests/benchmarks/src/Data/Text/Benchmarks/WordFrequencies.hs+28
tests/benchmarks/src/Data/Text/Benchmarks.hs+2−2
@@ -21,7 +21,7 @@ import qualified Data.Text.Benchmarks.Pure as Pure
2121import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
2222import qualified Data.Text.Benchmarks.Replace as Replace
2323import 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
2525
2626import qualified Data.Text.Benchmarks.Programs.Cut as Programs.Cut
2727import qualified Data.Text.Benchmarks.Programs.Sort as Programs.Sort
@@ -50,7 +50,7 @@ benchmarks = do
5050 , ReadNumbers.benchmark (tf "numbers.txt")
5151 , Replace.benchmark (tf "russian.txt") "принимая" "своем"
5252 , Search.benchmark (tf "russian.txt") "принимая"
53− , WordCount.benchmark (tf "russian.txt")
53+ , WordFrequencies.benchmark (tf "russian.txt")
5454 ]
5555
5656 -- 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