|
1 | | -{-# LANGUAGE BangPatterns #-} |
2 | 1 | {-# LANGUAGE ScopedTypeVariables #-} |
3 | 2 |
|
4 | 3 | module Main where |
5 | 4 |
|
6 | | -import Control.Monad |
7 | 5 | import Criterion.Main |
8 | | -import Data.List |
9 | | -import Data.Semigroup ((<>)) |
10 | | -import Data.Word |
11 | | -import Foreign |
12 | | -import HaskellWorks.Data.Json.Standard.Cursor.Internal.Blank |
13 | | -import HaskellWorks.Data.Json.Standard.Cursor.Internal.MakeIndex |
14 | | -import System.IO.MMap |
15 | | - |
16 | | -import qualified Data.ByteString as BS |
17 | | -import qualified Data.ByteString.Internal as BSI |
18 | | -import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as FAST |
19 | | -import qualified HaskellWorks.Data.Json.Standard.Cursor.Slow as SLOW |
20 | | -import qualified System.Directory as IO |
21 | | - |
22 | | -setupEnvJson :: FilePath -> IO BS.ByteString |
23 | | -setupEnvJson filepath = do |
24 | | - (fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr filepath ReadOnly Nothing |
25 | | - let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size |
26 | | - return bs |
27 | | - |
28 | | -jsonToInterestBits3 :: [BS.ByteString] -> [BS.ByteString] |
29 | | -jsonToInterestBits3 = blankedJsonToInterestBits . blankJson |
30 | | - |
31 | | -makeBenchBlankJson :: IO [Benchmark] |
32 | | -makeBenchBlankJson = do |
33 | | - entries <- IO.listDirectory "corpus/bench" |
34 | | - let files = ("corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries |
35 | | - benchmarks <- forM files $ \file -> return |
36 | | - [ env (setupEnvJson file) $ \bs -> bgroup file |
37 | | - [ bench "Run blankJson" (whnf (BS.concat . blankJson) [bs]) |
38 | | - ] |
39 | | - ] |
40 | | - |
41 | | - return (join benchmarks) |
42 | | - |
43 | | -makeBenchJsonToInterestBits :: IO [Benchmark] |
44 | | -makeBenchJsonToInterestBits = do |
45 | | - entries <- IO.listDirectory "corpus/bench" |
46 | | - let files = ("corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries |
47 | | - benchmarks <- forM files $ \file -> return |
48 | | - [ env (setupEnvJson file) $ \bs -> bgroup file |
49 | | - [ bench "Run blankJson" (whnf (BS.concat . jsonToInterestBits3) [bs]) |
50 | | - ] |
51 | | - ] |
52 | | - |
53 | | - return (join benchmarks) |
54 | | - |
55 | | -makeBenchMakeCursor :: IO [Benchmark] |
56 | | -makeBenchMakeCursor = do |
57 | | - entries <- IO.listDirectory "corpus/bench" |
58 | | - let files = ("corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries |
59 | | - benchmarks <- forM files $ \file -> return |
60 | | - [ env (setupEnvJson file) $ \bs -> bgroup file |
61 | | - [ bench "Run slow make cursor" (whnf SLOW.fromByteString bs) |
62 | | - , bench "Run fast make cursor" (whnf FAST.fromByteString bs) |
63 | | - ] |
64 | | - ] |
65 | | - |
66 | | - return (join benchmarks) |
67 | 6 |
|
68 | 7 | main :: IO () |
69 | 8 | main = do |
70 | 9 | benchmarks <- fmap mconcat $ sequence $ mempty |
71 | | - <> [makeBenchBlankJson] |
72 | | - <> [makeBenchJsonToInterestBits] |
73 | | - <> [makeBenchMakeCursor] |
74 | 10 | defaultMain benchmarks |
0 commit comments