{-# LANGUAGE OverloadedStrings #-} import Criterion.Main import qualified Data.Text as T import Data.Text.Format.Heavy import qualified Data.Text.Lazy as L import qualified Text.Printf as P printf1 :: (P.PrintfArg a) => String -> a -> String printf1 f a = P.printf f a printf2 :: (P.PrintfArg a, P.PrintfArg b) => String -> (a, b) -> String printf2 f (a, b) = P.printf f a b printf3 :: (P.PrintfArg a, P.PrintfArg b, P.PrintfArg c) => String -> (a, b, c) -> String printf3 f (a, b, c) = P.printf f a b c main = defaultMain [ bgroup "arity" [ bench "0" $ nf (format "hi") () , bench "1" $ nf (format "hi {}") (Single $ T.pack "mom") , bench "2" $ nf (format "hi {}, how are {}") (T.pack "mom", T.pack "you") , bench "3" $ nf (format "hi {}, how are {} keeping {}") (T.pack "mom", T.pack "you", T.pack "now") , bench "4" $ nf (format "hi {}, {} - how are {} keeping {}") (T.pack "mom", T.pack "hey", T.pack "you", T.pack "now") ] , bgroup "comparison" [ bench "format1" $ nf (format "hi mom {}\n") (Single (pi :: Double)) , bench "printf1" $ nf (printf1 "hi mom %f\n") (pi :: Double) , bench "show1" $ nf (\d -> "hi mom " ++ show d ++ "\n") (pi :: Double) , bench "format2" $ nf (format "hi mom {} {}\n") (pi :: Double, "yeah" :: T.Text) , bench "printf2" $ nf (printf2 "hi mom %f %s\n") (pi :: Double, "yeah" :: String) , bench "show2" $ nf (\(d, s) -> "hi mom " ++ show d ++ " " ++ show s ++ "\n") (pi :: Double, "yeah" :: String) , bench "format3" $ nf (format "hi mom {} {} {}\n") (pi :: Double, "yeah" :: T.Text, 21212121 :: Int) , bench "printf3" $ nf (printf3 "hi mom %f %s %d\n") (pi :: Double, "yeah" :: String, 21212121 :: Int) , bench "show3" $ nf (\(d, s, i) -> "hi mom " ++ show d ++ " " ++ show s ++ "\n") (pi :: Double, "yeah" :: String, 21212121 :: Int) ] , bgroup "types" [ bench "unit" $ nf (format "hi") () , bgroup "int" [ bench "small" $ nf (format "hi {}") (Single (1 :: Int)) , bench "medium" $ nf (format "hi {}") (Single (1234 :: Int)) , bench "large" $ nf (format "hi {}") (Single (0x7fffffff :: Int)) ] , bgroup "float" [ bench "small" $ nf (format "hi {}") (Single (1 :: Float)) , bench "medium" $ nf (format "hi {}") (Single (pi :: Float)) , bench "large" $ nf (format "hi {}") (Single (pi * 1e37 :: Float)) ] , bgroup "double" [ bench "small" $ nf (format "hi {}") (Single (1 :: Double)) , bench "medium" $ nf (format "hi {}") (Single (pi :: Double)) , bench "large" $ nf (format "hi {}") (Single (pi * 1e37 :: Double)) ] , bgroup "string" [ bench "small" $ nf (format "hi {}") (Single ("mom" :: String)) , bench "medium" $ nf (format "hi {}") (Single . concat . replicate 64 $ ("mom" :: String)) , bench "large" $ nf (format "hi {}") (Single . concat . replicate 1024 $ ("mom" :: String)) ] , bgroup "text" [ bench "small" $ nf (format "hi {}") (Single (T.pack "mom")) , bench "medium" $ nf (format "hi {}") (Single (T.replicate 64 "mom")) , bench "large" $ nf (format "hi {}") (Single (T.replicate 1024 "mom")) ] , bgroup "lazytext" [ bench "small" $ nf (format "hi {}") (Single (L.pack "mom")) , bench "medium" $ nf (format "hi {}") (Single . L.fromChunks . replicate 64 $ "mom") , bench "large" $ nf (format "hi {}") (Single . L.fromChunks . replicate 1024 $ "mom") ] ] ]