packages feed

GPipe-Core-0.2.3.1: bench/Graphics/GPipe/ExprBench.hs

{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}
module Graphics.GPipe.ExprBench (suite) where

import           Criterion.Main               (Benchmark, bench, bgroup, nfIO,
                                               whnfIO)

import           Graphics.GPipe.Internal.Expr
import           Graphics.GPipe.Linear        (V2 (..), norm)
import qualified LambdaRay.Config             as Config
import qualified LambdaRay.Schwarzschild      as Schwarzschild
import           System.Mem                   (performGC)


benchRaytracer :: Int -> IO String
benchRaytracer iterations = do
    -- performGC
    let
        config = Config.defaultConfig{Config.iterations}
        rt = Config.defaultRuntimeConfig
        expr = norm $ Schwarzschild.frag config (V2 100 100) rt (V2 30 30)
    finalSource <$> runExprM (tellGlobal "") (unS expr >>= tellAssignment' "result")


benchSum :: Int -> IO String
benchSum n = do
    performGC
    let expr :: FFloat
        expr = sum $ map fromIntegral [0..n]
    finalSource <$> runExprM (tellGlobal "") (unS expr >>= tellAssignment' "result")


suite :: IO Benchmark
suite = return $ bgroup "Expr"
    [ bgroup "raytracer"
        [ bench  "50" $ whnfIO (benchRaytracer  50)
        , bench "100" $ whnfIO (benchRaytracer 100)
        , bench "150" $ whnfIO (benchRaytracer 150)
        , bench "200" $ whnfIO (benchRaytracer 200)
        , bench "250" $ whnfIO (benchRaytracer 250)
        ]
    , bgroup "sum [0..n]"
        [ bench "1000" $ nfIO (benchSum 1000)
        , bench "2000" $ nfIO (benchSum 2000)
        , bench "3000" $ nfIO (benchSum 3000)
        , bench "4000" $ nfIO (benchSum 4000)
        , bench "5000" $ nfIO (benchSum 5000)
        ]
    ]