Created
May 6, 2014 14:00
-
-
Save AndrasKovacs/8ec5b7077355532b2227 to your computer and use it in GitHub Desktop.
Benchmarking primitive array snoc (GHC 7.8.2, 64 bit, -O2, -fllvm)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# 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