packages feed

vector-builder-0.3.4: foldl-benchmark/Main.hs

module Main where

import Prelude
import Criterion
import Criterion.Main
import qualified Control.Foldl as A
import qualified Data.Vector as F
import qualified Data.Vector.Unboxed as G
import qualified VectorBuilder.Builder as N
import qualified VectorBuilder.Vector as O


main =
  defaultMain [boxed, unboxed]
  where
    comparisons name builderSubject growingSubject =
      bgroup name (map comparison sizes)
      where
        sizes =
          [1000, 10000, 100000, 1000000, 10000000]
        comparison size =
          bgroup (show size)
          [
            bench "builder" (nf builderSubject input),
            bench "growing" (nf growingSubject input)
          ]
          where
            input =
              [0..size]
    boxed =
      comparisons "boxed" builderSubject growingSubject
      where
        builderSubject input =
          A.fold (A.foldMap N.singleton O.build) input :: Vector Int
        growingSubject input =
          runST (A.foldM A.vector input) :: Vector Int
    unboxed =
      comparisons "unboxed" builderSubject growingSubject
      where
        builderSubject input =
          A.fold (A.foldMap N.singleton O.build) input :: G.Vector Int
        growingSubject input =
          runST (A.foldM A.vector input) :: G.Vector Int