packages feed

rdf-0.1.0.0: bench/Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Criterion.Main

import qualified Data.ByteString.Builder as B

import Data.RDF.Types
import Data.RDF.Encode.NQuads
import Data.RDF.Parser.NQuads

import Data.String

import qualified Data.Text as T

import qualified Data.Text.Lazy          as TL
import qualified Data.Text.Lazy.Encoding as TL

-- | This function is inefficient. Run it outside of the benchmarks.
exampleGraph :: Int -> RDFGraph
exampleGraph n = RDFGraph (Just "http://user@benchmark.graph:8888/?graph") (take n (trips 0))
    where trips i = Triple (sub i) (pred i) (obj i) : trips (i+1)
          sub  = fromString . ("_:" ++) . show
          pred = fromString . ("<http://user@benchmark.graph/succ#" ++) . (++ ">") . show
          obj  = fromString . show

exampleDoc :: Int -> TL.Text
exampleDoc = TL.decodeUtf8 . B.toLazyByteString . encodeRDFGraph . exampleGraph

mkBenchEncodeGraph :: String -> Int -> Benchmark
mkBenchEncodeGraph p n = env (return (exampleGraph n))
                             (\ ~g -> bench (p ++ "/" ++ show n)
                                            (nf (B.toLazyByteString . encodeRDFGraph) g))

mkBenchDecodeGraph :: String -> Int -> Benchmark
mkBenchDecodeGraph p n = env (return (exampleDoc n))
                             (\ ~d -> bench (p ++ "/" ++ show n)
                                            (nf parseNQuads d))

main :: IO ()
main = defaultMain [ bgroup "fine" [ bgroup "encodeGraphFine" $ map (mkBenchEncodeGraph "encodeRDFGraph") [500,1000..100000]
                                   , bgroup "parseGraphsFine" $ map (mkBenchDecodeGraph "parseRDFGraph") [500,1000..100000]
                                   ]
                   , bgroup "coarse" [ bgroup "encodeGraphCoarse" $ map (mkBenchEncodeGraph "encodeRDFGraph") [100000,200000..1000000]
                                     , bgroup "parseGraphsCoarse" $ map (mkBenchDecodeGraph "parseRDFGraph") [100000,200000..1000000]
                                     ]
                   ]