@@ -1,58 +0,0 @@
1−-- | For every 1000th line of a file, check how many lines in the file are
2−-- lexicographically smaller
4−module Data.Text.Benchmarks.Ordering
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
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
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
31− , bench "String" $ readFile fp >>=
32− evaluate . numSmaller . lines
35−-- | Take every Nth item from a list
37−every :: Int -> [a] -> [a]
41− | n < k = go (n+1) xs
42− | otherwise = x : go 1 xs
47−numSmaller :: (Ord a) => [a] -> Int
48−numSmaller ls = sum . map f $ every 1000 ls
50− f x = length . filter ((== GT) . compare x) $ ls
52−-- | Test a comparison that could be fused: compare (toLower a) (toLower b)
53−-- Currently, this funcion performs very badly!
55−numSmallerFusion :: [T.Text] -> Int
56−numSmallerFusion ls = sum . map f $ every 1000 ls
58− f x = length . filter ((== GT) . compare (T.toLower x) . T.toLower) $ ls