on master help sign in
Sort benchmark, reloaded
commit572611e4d97f73ced1faaee7925d02a87a5ffa84 authorJasper Van der Jeugt <jaspervdj@gmail.com> dateSat 4 Jun 2011, 18:10 (15 years ago) parentd8ce043
3 files changed+53−29
tests/benchmarks/src/Data/Text/Benchmarks.hs+2−2 tests/benchmarks/src/Data/Text/Benchmarks/Programs/Sort.hs+51 tests/benchmarks/src/Data/Text/Benchmarks/Sort.hs−27
tests/benchmarks/src/Data/Text/Benchmarks.hs+2−2
@@ -21,11 +21,11 @@ import qualified Data.Text.Benchmarks.Ordering as Ordering
2121import qualified Data.Text.Benchmarks.Pure as Pure
2222import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
2323import qualified Data.Text.Benchmarks.Replace as Replace
24−import qualified Data.Text.Benchmarks.Sort as Sort
2524import qualified Data.Text.Benchmarks.StripBrackets as StripBrackets
2625import qualified Data.Text.Benchmarks.WordCount as WordCount
2726
2827import qualified Data.Text.Benchmarks.Programs.Cut as Programs.Cut
28+import qualified Data.Text.Benchmarks.Programs.Sort as Programs.Sort
2929import qualified Data.Text.Benchmarks.Programs.Throughput as Programs.Throughput
3030
3131main :: IO ()
@@ -50,7 +50,6 @@ benchmarks = do
5050 , Pure.benchmark (tf "japanese.txt")
5151 , ReadNumbers.benchmark (tf "numbers.txt")
5252 , Replace.benchmark (tf "russian.txt") sink "принимая" "своем"
53− , Sort.benchmark (tf "russian.txt") sink
5453 , StripBrackets.benchmark (tf "russian.txt") sink
5554 , WordCount.benchmark (tf "russian.txt")
5655 ]
@@ -58,6 +57,7 @@ benchmarks = do
5857 -- Program-like benchmarks
5958 ps <- bgroup "Programs" `fmap` sequence
6059 [ Programs.Cut.benchmark (tf "russian.txt") sink 20 40
60+ , Programs.Sort.benchmark (tf "russian.txt") sink
6161 , Programs.Throughput.benchmark (tf "russian.txt") sink
6262 ]
6363
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