on master help sign in
Sort benchmark, reloaded
572611eJasper Van der Jeugt
tests/benchmarks/src/Data/Text/Benchmarks.hs+2−2
@@ -21,11 +21,11 @@ import qualified Data.Text.Benchmarks.Ordering as Ordering
21import qualified Data.Text.Benchmarks.Pure as Pure
21import qualified Data.Text.Benchmarks.Pure as Pure
22import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
22import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
23import qualified Data.Text.Benchmarks.Replace as Replace
23import qualified Data.Text.Benchmarks.Replace as Replace
24−import qualified Data.Text.Benchmarks.Sort as Sort
25import qualified Data.Text.Benchmarks.StripBrackets as StripBrackets
24import qualified Data.Text.Benchmarks.StripBrackets as StripBrackets
26import qualified Data.Text.Benchmarks.WordCount as WordCount
25import qualified Data.Text.Benchmarks.WordCount as WordCount
27
26
28import qualified Data.Text.Benchmarks.Programs.Cut as Programs.Cut
27import qualified Data.Text.Benchmarks.Programs.Cut as Programs.Cut
28+import qualified Data.Text.Benchmarks.Programs.Sort as Programs.Sort
29import qualified Data.Text.Benchmarks.Programs.Throughput as Programs.Throughput
29import qualified Data.Text.Benchmarks.Programs.Throughput as Programs.Throughput
30
30
31main :: IO ()
31main :: IO ()
@@ -50,7 +50,6 @@ benchmarks = do
50 , Pure.benchmark (tf "japanese.txt")
50 , Pure.benchmark (tf "japanese.txt")
51 , ReadNumbers.benchmark (tf "numbers.txt")
51 , ReadNumbers.benchmark (tf "numbers.txt")
52 , Replace.benchmark (tf "russian.txt") sink "принимая" "своем"
52 , Replace.benchmark (tf "russian.txt") sink "принимая" "своем"
53− , Sort.benchmark (tf "russian.txt") sink
54 , StripBrackets.benchmark (tf "russian.txt") sink
53 , StripBrackets.benchmark (tf "russian.txt") sink
55 , WordCount.benchmark (tf "russian.txt")
54 , WordCount.benchmark (tf "russian.txt")
56 ]
55 ]
@@ -58,6 +57,7 @@ benchmarks = do
58 -- Program-like benchmarks
57 -- Program-like benchmarks
59 ps <- bgroup "Programs" `fmap` sequence
58 ps <- bgroup "Programs" `fmap` sequence
60 [ Programs.Cut.benchmark (tf "russian.txt") sink 20 40
59 [ Programs.Cut.benchmark (tf "russian.txt") sink 20 40
60+ , Programs.Sort.benchmark (tf "russian.txt") sink
61 , Programs.Throughput.benchmark (tf "russian.txt") sink
61 , Programs.Throughput.benchmark (tf "russian.txt") sink
62 ]
62 ]
63
63
tests/benchmarks/src/Data/Text/Benchmarks/Programs/Sort.hsnew file+51
@@ -0,0 +1,51 @@
1+-- | This benchmark sorts the lines of a file, like the @sort@ unix utility.
2+--
3+{-# LANGUAGE OverloadedStrings #-}
4+module Data.Text.Benchmarks.Programs.Sort
5+ ( benchmark
6+ ) where
7+
8+import Criterion (Benchmark, bgroup, bench)
9+import Data.Monoid (mconcat)
10+import System.IO (Handle, hPutStr)
11+import qualified Data.ByteString as B
12+import qualified Data.ByteString.Lazy as BL
13+import qualified Data.ByteString.Lazy.Char8 as BLC
14+import qualified Data.ByteString.Char8 as BC
15+import qualified Data.List as L
16+import qualified Data.Text as T
17+import qualified Data.Text.IO as T
18+import qualified Data.Text.Lazy as TL
19+import qualified Data.Text.Lazy.IO as TL
20+import qualified Data.Text.Lazy.Builder as TLB
21+
22+benchmark :: FilePath -> Handle -> IO Benchmark
23+benchmark i o = return $ bgroup "Sort"
24+ [ bench "String" $ readFile i >>= hPutStr o . string
25+ , bench "ByteString" $ B.readFile i >>= B.hPutStr o . byteString
26+ , bench "LazyByteString" $ BL.readFile i >>= BL.hPutStr o . lazyByteString
27+ , bench "Text" $ T.readFile i >>= T.hPutStr o . text
28+ , bench "LazyText" $ TL.readFile i >>= TL.hPutStr o . lazyText
29+ , bench "TextBuilder" $ T.readFile i >>= TL.hPutStr o . textBuilder
30+ ]
31+
32+string :: String -> String
33+string = unlines . L.sort . lines
34+
35+byteString :: B.ByteString -> B.ByteString
36+byteString = BC.unlines . L.sort . BC.lines
37+
38+lazyByteString :: BL.ByteString -> BL.ByteString
39+lazyByteString = BLC.unlines . L.sort . BLC.lines
40+
41+text :: T.Text -> T.Text
42+text = T.unlines . L.sort . T.lines
43+
44+lazyText :: TL.Text -> TL.Text
45+lazyText = TL.unlines . L.sort . TL.lines
46+
47+-- | Text variant using a builder monoid for the final concatenation
48+--
49+textBuilder :: T.Text -> TL.Text
50+textBuilder = TLB.toLazyText . mconcat . L.intersperse (TLB.singleton '\n') .
51+ map TLB.fromText . L.sort . T.lines
tests/benchmarks/src/Data/Text/Benchmarks/Sort.hsdeleted−27
@@ -1,27 +0,0 @@
1−-- | Implements the unix @sort@ program
2−--
3−{-# LANGUAGE OverloadedStrings #-}
4−module Data.Text.Benchmarks.Sort
5− ( benchmark
6− ) where
7−
8−import Criterion (Benchmark, bench)
9−import Data.Monoid (mconcat)
10−import System.IO (Handle)
11−import qualified Data.ByteString as B
12−import qualified Data.ByteString.Lazy as BL
13−import qualified Data.List as L
14−import qualified Data.Text as T
15−import qualified Data.Text.Encoding as T
16−import qualified Data.Text.Lazy as TL
17−import qualified Data.Text.Lazy.Builder as TLB
18−import qualified Data.Text.Lazy.Encoding as TL
19−
20−benchmark :: FilePath -> Handle -> IO Benchmark
21−benchmark fp sink = return $ bench "Sort" $ do
22− t <- T.decodeUtf8 `fmap` B.readFile fp
23− BL.hPutStr sink $ TL.encodeUtf8 $ sort t
24−
25−sort :: T.Text -> TL.Text
26−sort = TLB.toLazyText . mconcat . L.intersperse (TLB.fromText "\n") .
27− map TLB.fromText . L.sort . T.lines