massiv-io-1.0.0.1: bench/Convert.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Criterion.Main
import Data.Massiv.Array as A
import Data.Massiv.Array.IO as A
import Data.ByteString as B
import Data.ByteString.Lazy as BL
encodeIO :: Writable f arr => f -> arr -> IO B.ByteString
encodeIO f img =
BL.toStrict <$> encodeM f def img
{-# INLINE encodeIO #-}
benchDecode ::
forall fr fw r cs e.
( Readable fr (Image S cs e)
, Writable fw (Image S cs e)
, Load r Ix2 (Pixel cs e)
, ColorModel cs e
)
=> String
-> fr -- ^ Decode as
-> fw -- ^ Encode as
-> Image r cs e
-> Benchmark
benchDecode name fr fw img =
env (encodeIO fw (computeAs S img)) $ \bs ->
bench name $ nfIO (decodeM fr bs :: IO (Image S cs e))
convertIO ::
forall cs' e' i' r cs e i. (Source r (Pixel cs e), ColorSpace cs i e, ColorSpace cs' i' e')
=> Image r cs e
-> IO (Image S cs' e')
convertIO = computeIO . convertImage
{-# INLINE convertIO #-}
main :: IO ()
main = do
!frog <- readImageAuto "files/frog.jpg" :: IO (Image S (SRGB 'NonLinear) Double)
defaultMain
[ bgroup "Convert" [bench "Y'CbCr" $ nfIO (convertIO frog :: IO (Image S (Y'CbCr SRGB) Double))]
, bgroup
"Encode"
[ bgroup
"PNG"
[ bgroup
"Exact"
[ env (convertIO frog) $ \(f :: Image S (SRGB 'NonLinear) Word8) ->
bench "SRGB Word8" $ nfIO (encodeIO PNG f)
, env (convertIO frog) $ \(f :: Image S (SRGB 'NonLinear) Word16) ->
bench "SRGB Word16" $ nfIO (encodeIO PNG f)
]
, bgroup
"Auto"
[ env (convertIO frog) $ \(f :: Image S (SRGB 'NonLinear) Word8) ->
bench "SRGB Word8" $ nfIO (encodeIO (Auto PNG) f)
, env (convertIO frog) $ \(f :: Image S (SRGB 'NonLinear) Word16) ->
bench "SRGB Word16" $ nfIO (encodeIO (Auto PNG) f)
, env (convertIO frog) $ \(f :: Image S (SRGB 'NonLinear) Word32) ->
bench "SRGB Word32" $ nfIO (encodeIO (Auto PNG) f)
]
]
]
, bgroup
"Decode"
[ bgroup
"PNG"
[ bgroup
"Exact"
[ benchDecode "SRGB Word8" PNG PNG $
(convertImage frog :: Image D (SRGB 'NonLinear) Word8)
, benchDecode "SRGB Word16" PNG PNG $
(convertImage frog :: Image D (SRGB 'NonLinear) Word16)
]
, bgroup
"Auto"
[ benchDecode "SRGB Word8" (Auto PNG) PNG $
(convertImage frog :: Image D (SRGB 'NonLinear) Word8)
, benchDecode "SRGB Word16" (Auto PNG) PNG $
(convertImage frog :: Image D (SRGB 'NonLinear) Word16)
, env (encodeIO PNG =<< (convertIO frog :: IO (Image S (SRGB 'NonLinear) Word8))) $ \bs ->
bench "SRGB Word8 -> Word16" $
nfIO (decodeM (Auto PNG) bs :: IO (Image S (SRGB 'NonLinear) Word16))
]
]
]
]