@@ -1,58 +0,0 @@
1−-- | For every 1000th line of a file, check how many lines in the file are
2−-- lexicographically smaller
3−--
4−module Data.Text.Benchmarks.Ordering
5− ( benchmark
6− ) where
7−
8−import Control.Exception (evaluate)
9−import Criterion (Benchmark, bgroup, bench)
10−import qualified Data.ByteString.Char8 as B
11−import qualified Data.ByteString.Lazy.Char8 as BL
12−import qualified Data.Text as T
13−import qualified Data.Text.Encoding as T
14−import qualified Data.Text.Lazy as TL
15−import qualified Data.Text.Lazy.Encoding as TL
16−
17−benchmark :: FilePath -> IO Benchmark
18−benchmark fp = return $ bgroup "Ordering"
19− [ bench "ByteString" $ B.readFile fp >>=
20− evaluate . numSmaller . B.lines
21− , bench "LazyByteString" $ BL.readFile fp >>=
22− evaluate . numSmaller . BL.lines
23−
24− , bench "Text" $ B.readFile fp >>=
25− evaluate . numSmaller . T.lines . T.decodeUtf8
26− , bench "TextFusion" $ B.readFile fp >>=
27− evaluate . numSmallerFusion . T.lines . T.decodeUtf8
28− , bench "LazyText" $ BL.readFile fp >>=
29− evaluate . numSmaller . TL.lines . TL.decodeUtf8
30−
31− , bench "String" $ readFile fp >>=
32− evaluate . numSmaller . lines
33− ]
34−
35−-- | Take every Nth item from a list
36−--
37−every :: Int -> [a] -> [a]
38−every k = go k
39− where
40− go n (x : xs)
41− | n < k = go (n+1) xs
42− | otherwise = x : go 1 xs
43− go _ _ = []
44−
45−-- | Benchmark logic
46−--
47−numSmaller :: (Ord a) => [a] -> Int
48−numSmaller ls = sum . map f $ every 1000 ls
49− where
50− f x = length . filter ((== GT) . compare x) $ ls
51−
52−-- | Test a comparison that could be fused: compare (toLower a) (toLower b)
53−-- Currently, this funcion performs very badly!
54−--
55−numSmallerFusion :: [T.Text] -> Int
56−numSmallerFusion ls = sum . map f $ every 1000 ls
57− where
58− f x = length . filter ((== GT) . compare (T.toLower x) . T.toLower) $ ls