Skip to content

Instantly share code, notes, and snippets.

@AndrasKovacs
Created May 6, 2014 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndrasKovacs/8ec5b7077355532b2227 to your computer and use it in GitHub Desktop.
Save AndrasKovacs/8ec5b7077355532b2227 to your computer and use it in GitHub Desktop.
Benchmarking primitive array snoc (GHC 7.8.2, 64 bit, -O2, -fllvm)
{-# LANGUAGE MagicHash, UnboxedTuples #-}
import Criterion.Main
import Criterion.Config
import GHC.Exts
import GHC.ST
data Array a = Array (Array# a)
snoc :: Array a -> a -> Array a
snoc (Array arr) a = runSTRep go where
size = sizeofArray# arr
go s = case newArray# (size +# 1#) undefined s of
(# s, marr #) -> case copyArray# arr 0# marr 0# size s of
s -> case writeArray# marr size a s of
s -> case unsafeFreezeArray# marr s of
(# s, arr #) -> (# s, Array arr #)
badSnoc :: Array a -> a -> Array a
badSnoc (Array arr) a = runSTRep go where
size = sizeofArray# arr
go s = case thawArray# arr 0# (size +# 1#) s of
(# s, marr #) -> case writeArray# marr size a s of
s -> case unsafeFreezeArray# marr s of
(# s, arr #) -> (# s, Array arr #)
arrN :: Int# -> Array Int
arrN n = runSTRep $ \s ->
case newArray# n 0 s of
(# s, marr #) -> case unsafeFreezeArray# marr s of
(#s, arr #) -> (# s, Array arr #)
arr16 = arrN 16#
arr32 = arrN 32#
arr64 = arrN 64#
arr128 = arrN 128#
main = defaultMain [
bgroup "correct snoc" [
bench "16" $ whnf (snoc arr16) 0,
bench "32" $ whnf (snoc arr32) 0,
bench "64" $ whnf (snoc arr64) 0,
bench "128" $ whnf (snoc arr128) 0],
bgroup "bad snoc" [
bench "16" $ whnf (badSnoc arr16) 0,
bench "32" $ whnf (badSnoc arr32) 0,
bench "64" $ whnf (badSnoc arr64) 0,
bench "128" $ whnf (badSnoc arr128) 0]]
--benchmarking correct snoc/16
--mean: 46.60290 ns, lb 46.56561 ns, ub 46.66140 ns, ci 0.950
--std dev: 235.2700 ps, lb 172.9977 ps, ub 373.1705 ps, ci 0.950
--benchmarking correct snoc/32
--mean: 65.33516 ns, lb 65.17872 ns, ub 65.64260 ns, ci 0.950
--std dev: 1.082175 ns, lb 636.5303 ps, ub 1.712018 ns, ci 0.950
--found 13 outliers among 100 samples (13.0%)
-- 7 (7.0%) high mild
-- 6 (6.0%) high severe
--variance introduced by outliers: 9.430%
--variance is slightly inflated by outliers
--benchmarking correct snoc/64
--mean: 110.0617 ns, lb 109.9513 ns, ub 110.2091 ns, ci 0.950
--std dev: 648.5001 ps, lb 513.0129 ps, ub 860.6144 ps, ci 0.950
--benchmarking correct snoc/128
--mean: 194.2914 ns, lb 194.0911 ns, ub 194.6587 ns, ci 0.950
--std dev: 1.349119 ns, lb 858.5008 ps, ub 2.288195 ns, ci 0.950
--benchmarking bad snoc/16
--mean: 30.81385 ns, lb 30.78918 ns, ub 30.85464 ns, ci 0.950
--std dev: 159.3362 ps, lb 111.8137 ps, ub 277.3667 ps, ci 0.950
--benchmarking bad snoc/32
--mean: 36.88745 ns, lb 36.84675 ns, ub 36.95231 ns, ci 0.950
--std dev: 259.5303 ps, lb 183.9927 ps, ub 372.7115 ps, ci 0.950
--benchmarking bad snoc/64
--mean: 48.17699 ns, lb 48.11275 ns, ub 48.31529 ns, ci 0.950
--std dev: 461.1484 ps, lb 261.1350 ps, ub 898.3459 ps, ci 0.950
--benchmarking bad snoc/128
--mean: 74.11893 ns, lb 73.91701 ns, ub 74.59164 ns, ci 0.950
--std dev: 1.491183 ns, lb 760.9970 ps, ub 2.895699 ns, ci 0.950
--found 10 outliers among 100 samples (10.0%)
-- 5 (5.0%) high mild
-- 5 (5.0%) high severe
--variance introduced by outliers: 13.243%
--variance is moderately inflated by outliers
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment