packages feed

type-machine-0.1.0.0: benchmarks/runtime/Benchmark.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
{-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-}

module Benchmark (benchmarks) where

import Control.Lens ((^.))
import Criterion.Main
import Data.Functor
import Gen
import SuperRecord (get)

$(genWithFieldCount 2)
$(genWithFieldCount 4)
$(genWithFieldCount 5)
$(genWithFieldCount 10)
$(genWithFieldCount 15)
$(genWithFieldCount 20)

benchmarks :: [Benchmark]
benchmarks = [build, traversals]

data Case = TM | SuperRecord | Extensible

buildRecord :: Case -> Int -> ()
buildRecord c n = flip seq () $ case n of
    2 -> case c of
        TM -> field2_1 mkRecordTM2
        SuperRecord -> get #fSR2_1 mkSuperRRecord2
        Extensible -> mkExtensibleRecord2 ^. #fE2_1
    4 -> case c of
        TM -> field4_1 mkRecordTM4
        SuperRecord -> get #fSR4_3 mkSuperRRecord4
        Extensible -> mkExtensibleRecord4 ^. #fE4_3
    5 -> case c of
        TM -> field5_1 mkRecordTM5
        SuperRecord -> get #fSR5_4 mkSuperRRecord5
        Extensible -> mkExtensibleRecord5 ^. #fE5_4
    10 -> case c of
        TM -> field10_9 mkRecordTM10
        SuperRecord -> get #fSR10_9 mkSuperRRecord10
        Extensible -> mkExtensibleRecord10 ^. #fE10_9
    15 -> case c of
        TM -> field15_14 mkRecordTM15
        SuperRecord -> get #fSR15_14 mkSuperRRecord15
        Extensible -> mkExtensibleRecord15 ^. #fE15_14
    20 -> case c of
        TM -> field20_19 mkRecordTM20
        SuperRecord -> get #fSR20_19 mkSuperRRecord20
        Extensible -> mkExtensibleRecord20 ^. #fE20_19
    _ -> error "unhandled n"

build :: Benchmark
build =
    bgroup
        "build"
        $ depths <&> \n ->
            bgroup
                (show n)
                ( cases <&> \(bname, case_) ->
                    bench bname $
                        nf
                            (uncurry buildRecord)
                            (case_, n)
                )
  where
    depths = [2, 4, 5, 10, 20]
    cases = [("tm", TM), ("superrecord", SuperRecord), ("extensible", Extensible)]

traversals :: Benchmark
traversals =
    bgroup
        "traverse"
        [ bgroup
            "2"
            [ bench "tm" $ nf sumRecordTM2 mkRecordTM2
            , bench "superrecord" $ nf sumSuperRRecord2 mkSuperRRecord2
            , bench "extensible" $ nf sumExtensibleRecord2 mkExtensibleRecord2
            ]
        , bgroup
            "4"
            [ bench "tm" $ nf sumRecordTM4 mkRecordTM4
            , bench "superrecord" $ nf sumSuperRRecord4 mkSuperRRecord4
            , bench "extensible" $ nf sumExtensibleRecord4 mkExtensibleRecord4
            ]
        , bgroup
            "5"
            [ bench "tm" $ nf sumRecordTM5 mkRecordTM5
            , bench "superrecord" $ nf sumSuperRRecord5 mkSuperRRecord5
            , bench "extensible" $ nf sumExtensibleRecord5 mkExtensibleRecord5
            ]
        , bgroup
            "10"
            [ bench "tm" $ nf sumRecordTM10 mkRecordTM10
            , bench "superrecord" $ nf sumSuperRRecord10 mkSuperRRecord10
            , bench "extensible" $ nf sumExtensibleRecord10 mkExtensibleRecord10
            ]
        , bgroup
            "15"
            [ bench "tm" $ nf sumRecordTM15 mkRecordTM15
            , bench "superrecord" $ nf sumSuperRRecord15 mkSuperRRecord15
            , bench "extensible" $ nf sumExtensibleRecord15 mkExtensibleRecord15
            ]
        , bgroup
            "20"
            [ bench "tm" $ nf sumRecordTM20 mkRecordTM20
            , bench "superrecord" $ nf sumSuperRRecord20 mkSuperRRecord20
            , bench "extensible" $ nf sumExtensibleRecord20 mkExtensibleRecord20
            ]
        ]