Skip to content

Instantly share code, notes, and snippets.

@jmspiewak
Last active July 12, 2017 17:30
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 jmspiewak/87ccfe0e20c05cb0114c90d26ae23a7c to your computer and use it in GitHub Desktop.
Save jmspiewak/87ccfe0e20c05cb0114c90d26ae23a7c to your computer and use it in GitHub Desktop.
Iterators: GHC 8.0 vs 8.2
benchmarking cheating
time 243.8 μs (243.2 μs .. 244.4 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 244.4 μs (244.2 μs .. 244.7 μs)
std dev 1.055 μs (852.6 ns .. 1.361 μs)
benchmarking boxed vector
time 689.7 μs (685.5 μs .. 693.4 μs)
1.000 R² (0.999 R² .. 1.000 R²)
mean 685.0 μs (681.0 μs .. 689.6 μs)
std dev 16.74 μs (12.87 μs .. 22.28 μs)
variance introduced by outliers: 17% (moderately inflated)
benchmarking unboxed vector
time 767.3 μs (757.1 μs .. 776.9 μs)
0.999 R² (0.999 R² .. 1.000 R²)
mean 768.9 μs (761.1 μs .. 775.6 μs)
std dev 28.31 μs (21.97 μs .. 37.17 μs)
variance introduced by outliers: 31% (moderately inflated)
benchmarking list
time 767.6 μs (766.0 μs .. 769.5 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 769.5 μs (768.0 μs .. 771.5 μs)
std dev 6.600 μs (5.566 μs .. 8.040 μs)
benchmarking recursion
time 723.5 μs (719.5 μs .. 727.7 μs)
0.999 R² (0.999 R² .. 1.000 R²)
mean 719.3 μs (713.9 μs .. 725.2 μs)
std dev 22.42 μs (18.76 μs .. 27.19 μs)
variance introduced by outliers: 24% (moderately inflated)
benchmarking primitive
time 649.5 μs (645.8 μs .. 654.5 μs)
0.995 R² (0.984 R² .. 1.000 R²)
mean 662.0 μs (653.5 μs .. 685.5 μs)
std dev 53.85 μs (20.42 μs .. 107.2 μs)
variance introduced by outliers: 70% (severely inflated)
benchmarking iterator 1
time 4.391 ms (4.367 ms .. 4.415 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 4.373 ms (4.367 ms .. 4.382 ms)
std dev 26.07 μs (18.47 μs .. 39.60 μs)
benchmarking iterator 1 unboxed
time 2.367 ms (2.362 ms .. 2.373 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 2.366 ms (2.363 ms .. 2.369 ms)
std dev 9.766 μs (8.094 μs .. 12.79 μs)
benchmarking iterator 2
time 13.43 ms (13.39 ms .. 13.47 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 13.44 ms (13.42 ms .. 13.45 ms)
std dev 45.56 μs (35.89 μs .. 57.55 μs)
benchmarking iterator 3
time 8.507 ms (8.500 ms .. 8.515 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.513 ms (8.508 ms .. 8.523 ms)
std dev 24.05 μs (16.97 μs .. 37.83 μs)
benchmarking iterator 4
time 2.949 ms (2.944 ms .. 2.955 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 2.956 ms (2.952 ms .. 2.960 ms)
std dev 14.98 μs (9.894 μs .. 21.59 μs)
benchmarking iterator 5
time 705.5 μs (700.3 μs .. 711.0 μs)
1.000 R² (0.999 R² .. 1.000 R²)
mean 701.8 μs (698.2 μs .. 705.2 μs)
std dev 12.91 μs (10.36 μs .. 16.99 μs)
variance introduced by outliers: 10% (moderately inflated)
benchmarking cheating
time 257.2 μs (256.7 μs .. 257.6 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 258.1 μs (257.9 μs .. 258.4 μs)
std dev 1.007 μs (789.7 ns .. 1.323 μs)
benchmarking boxed vector
time 10.63 ms (10.58 ms .. 10.67 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 10.62 ms (10.59 ms .. 10.64 ms)
std dev 86.73 μs (69.73 μs .. 109.0 μs)
benchmarking unboxed vector
time 8.021 ms (8.011 ms .. 8.029 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.038 ms (8.029 ms .. 8.057 ms)
std dev 40.25 μs (25.53 μs .. 60.71 μs)
benchmarking list
time 8.225 ms (8.211 ms .. 8.235 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.258 ms (8.244 ms .. 8.300 ms)
std dev 72.61 μs (37.14 μs .. 141.6 μs)
benchmarking recursion
time 8.525 ms (8.508 ms .. 8.545 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.514 ms (8.507 ms .. 8.528 ms)
std dev 32.53 μs (18.59 μs .. 65.22 μs)
benchmarking primitive
time 777.6 μs (776.3 μs .. 779.3 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 779.6 μs (778.3 μs .. 781.6 μs)
std dev 6.171 μs (4.349 μs .. 10.14 μs)
benchmarking iterator 1
time 13.89 ms (13.84 ms .. 13.92 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 13.85 ms (13.84 ms .. 13.86 ms)
std dev 41.59 μs (32.88 μs .. 55.41 μs)
benchmarking iterator 1 unboxed
time 11.21 ms (11.20 ms .. 11.22 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 11.22 ms (11.21 ms .. 11.25 ms)
std dev 61.49 μs (32.36 μs .. 113.9 μs)
benchmarking iterator 2
time 20.30 ms (20.25 ms .. 20.35 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 20.28 ms (20.27 ms .. 20.31 ms)
std dev 57.64 μs (39.61 μs .. 84.22 μs)
benchmarking iterator 3
time 14.32 ms (14.30 ms .. 14.34 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 14.33 ms (14.32 ms .. 14.35 ms)
std dev 46.25 μs (30.60 μs .. 70.25 μs)
benchmarking iterator 4
time 10.98 ms (10.96 ms .. 11.00 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 10.99 ms (10.98 ms .. 11.00 ms)
std dev 34.12 μs (23.33 μs .. 55.26 μs)
benchmarking iterator 5
time 8.590 ms (8.584 ms .. 8.595 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.591 ms (8.585 ms .. 8.598 ms)
std dev 20.92 μs (15.32 μs .. 28.60 μs)
benchmarking cheating
time 242.9 μs (241.5 μs .. 243.7 μs)
1.000 R² (0.999 R² .. 1.000 R²)
mean 243.3 μs (241.6 μs .. 243.7 μs)
std dev 2.927 μs (926.9 ns .. 6.434 μs)
benchmarking boxed vector
time 773.8 μs (773.1 μs .. 774.6 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 772.1 μs (771.3 μs .. 772.7 μs)
std dev 2.733 μs (2.313 μs .. 3.371 μs)
benchmarking unboxed vector
time 772.7 μs (772.0 μs .. 773.5 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 772.0 μs (771.4 μs .. 773.2 μs)
std dev 3.367 μs (2.204 μs .. 5.843 μs)
benchmarking list
time 935.5 μs (934.7 μs .. 936.5 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 934.6 μs (933.9 μs .. 935.4 μs)
std dev 3.177 μs (2.532 μs .. 4.558 μs)
benchmarking recursion
time 773.5 μs (772.4 μs .. 775.0 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 771.2 μs (770.6 μs .. 772.1 μs)
std dev 2.786 μs (2.115 μs .. 3.774 μs)
benchmarking primitive
time 773.2 μs (772.7 μs .. 773.6 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 771.5 μs (771.0 μs .. 772.2 μs)
std dev 2.286 μs (1.944 μs .. 2.747 μs)
benchmarking iterator 1
time 3.321 ms (3.313 ms .. 3.330 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 3.314 ms (3.310 ms .. 3.321 ms)
std dev 18.49 μs (13.62 μs .. 26.50 μs)
benchmarking iterator 1 unboxed
time 1.398 ms (1.368 ms .. 1.458 ms)
0.994 R² (0.987 R² .. 1.000 R²)
mean 1.372 ms (1.366 ms .. 1.393 ms)
std dev 40.26 μs (6.066 μs .. 86.14 μs)
variance introduced by outliers: 20% (moderately inflated)
benchmarking iterator 2
time 794.0 μs (782.3 μs .. 801.6 μs)
0.999 R² (0.997 R² .. 1.000 R²)
mean 782.1 μs (775.6 μs .. 786.8 μs)
std dev 21.09 μs (17.04 μs .. 32.05 μs)
variance introduced by outliers: 19% (moderately inflated)
benchmarking iterator 3
time 759.8 μs (757.8 μs .. 761.6 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 749.7 μs (746.7 μs .. 752.1 μs)
std dev 10.53 μs (8.693 μs .. 15.04 μs)
benchmarking iterator 4
time 2.586 ms (2.580 ms .. 2.592 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 2.578 ms (2.576 ms .. 2.582 ms)
std dev 12.56 μs (9.443 μs .. 16.68 μs)
benchmarking iterator 5
time 704.0 μs (702.6 μs .. 705.4 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 702.9 μs (701.9 μs .. 703.7 μs)
std dev 3.378 μs (2.869 μs .. 4.228 μs)
benchmarking cheating
time 390.6 μs (388.8 μs .. 392.3 μs)
1.000 R² (1.000 R² .. 1.000 R²)
mean 390.2 μs (389.1 μs .. 391.6 μs)
std dev 4.583 μs (3.652 μs .. 6.148 μs)
benchmarking boxed vector
time 8.990 ms (8.870 ms .. 9.089 ms)
0.999 R² (0.998 R² .. 1.000 R²)
mean 8.841 ms (8.808 ms .. 8.904 ms)
std dev 144.2 μs (89.49 μs .. 235.8 μs)
benchmarking unboxed vector
time 8.732 ms (8.707 ms .. 8.749 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.882 ms (8.830 ms .. 8.960 ms)
std dev 213.4 μs (110.7 μs .. 326.9 μs)
benchmarking list
time 8.594 ms (8.584 ms .. 8.606 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.602 ms (8.592 ms .. 8.618 ms)
std dev 40.57 μs (25.93 μs .. 68.13 μs)
benchmarking recursion
time 8.839 ms (8.826 ms .. 8.850 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.822 ms (8.812 ms .. 8.835 ms)
std dev 35.26 μs (25.75 μs .. 55.03 μs)
benchmarking primitive
time 962.8 μs (957.5 μs .. 968.8 μs)
1.000 R² (0.999 R² .. 1.000 R²)
mean 952.6 μs (948.9 μs .. 956.6 μs)
std dev 14.78 μs (12.24 μs .. 18.61 μs)
benchmarking iterator 1
time 12.83 ms (12.80 ms .. 12.86 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 12.81 ms (12.79 ms .. 12.82 ms)
std dev 43.44 μs (33.31 μs .. 56.34 μs)
benchmarking iterator 1 unboxed
time 9.149 ms (9.137 ms .. 9.160 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 9.126 ms (9.118 ms .. 9.134 ms)
std dev 26.63 μs (22.60 μs .. 32.72 μs)
benchmarking iterator 2
time 7.663 ms (7.649 ms .. 7.692 ms)
1.000 R² (0.999 R² .. 1.000 R²)
mean 7.677 ms (7.659 ms .. 7.721 ms)
std dev 87.34 μs (17.90 μs .. 186.6 μs)
benchmarking iterator 3
time 8.360 ms (8.345 ms .. 8.377 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.353 ms (8.342 ms .. 8.365 ms)
std dev 38.99 μs (30.78 μs .. 50.35 μs)
benchmarking iterator 4
time 11.08 ms (11.07 ms .. 11.10 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 11.06 ms (11.06 ms .. 11.07 ms)
std dev 23.46 μs (17.93 μs .. 31.65 μs)
benchmarking iterator 5
time 8.294 ms (8.287 ms .. 8.301 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 8.289 ms (8.281 ms .. 8.296 ms)
std dev 25.81 μs (19.94 μs .. 33.65 μs)
Iterator 2
Rec {
-- RHS size: {terms: 38, types: 11, coercions: 0, joins: 1/1}
Main.main_$s$wloop1 [Occ=LoopBreaker]
:: Int# -> Int# -> Int# -> Int#
[GblId, Arity=3, Caf=NoCafRefs, Str=<S,U><S,U><S,U>]
Main.main_$s$wloop1
= \ (sc_seow :: Int#) (sc1_seov :: Int#) (sc2_seou :: Int#) ->
joinrec {
$wloop2_sdWm [InlPrag=[0], Occ=LoopBreaker] :: Int# -> Int# -> Int#
[LclId[JoinId(2)], Arity=2, Str=<S,U><S,U>, Unf=OtherCon []]
$wloop2_sdWm (ww_sdWe :: Int#) (ww1_sdWj :: Int#)
= case tagToEnum# @ Bool (># ww_sdWe ww1_sdWj) of {
False ->
case remInt# ww_sdWe 2# of {
__DEFAULT -> jump $wloop2_sdWm (+# ww_sdWe 1#) ww1_sdWj;
0# ->
Main.main_$s$wloop1
ww1_sdWj (+# ww_sdWe 1#) (+# sc2_seou (*# ww_sdWe 2#))
};
True -> sc2_seou
}; } in
jump $wloop2_sdWm sc1_seov sc_seow
end Rec }
Iterator 4
-- RHS size: {terms: 53, types: 27, coercions: 0, joins: 1/2}
Main.$wfuncs [InlPrag=[0]] :: Int# -> Int#
[GblId,
Arity=1,
Caf=NoCafRefs,
Str=<S,U>,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 189 0}]
Main.$wfuncs
= \ (ww_sdZa :: Int#) ->
letrec {
$wloop2_sdYV [InlPrag=[0], Occ=LoopBreaker]
:: Int# -> Step4 Int Int
[LclId, Arity=1, Str=<S,U>, Unf=OtherCon []]
$wloop2_sdYV
= \ (ww1_sdYT :: Int#) ->
case tagToEnum# @ Bool (># ww1_sdYT ww_sdZa) of {
False ->
case remInt# ww1_sdYT 2# of {
__DEFAULT -> $wloop2_sdYV (+# ww1_sdYT 1#);
0# ->
Main.Yield4
@ Int @ Int (GHC.Types.I# (+# ww1_sdYT 1#)) (GHC.Types.I# ww1_sdYT)
};
True -> Main.Done4 @ Int @ Int
}; } in
joinrec {
$wloop3_sdZ6 [InlPrag=[0], Occ=LoopBreaker] :: Int# -> Int# -> Int#
[LclId[JoinId(2)], Arity=2, Str=<S,U><S,U>, Unf=OtherCon []]
$wloop3_sdZ6 (ww1_sdZ0 :: Int#) (ww2_sdZ4 :: Int#)
= case $wloop2_sdYV ww2_sdZ4 of {
Done4 -> ww1_sdZ0;
Yield4 s2_a5TH x_a5TI ->
case x_a5TI of { I# x1_a9PD ->
case s2_a5TH of { I# ww4_XebL ->
jump $wloop3_sdZ6 (+# ww1_sdZ0 (*# x1_a9PD 2#)) ww4_XebL
}
}
}; } in
jump $wloop3_sdZ6 0# 1#
Iterator 5
Main.main14
= \ (w_se2T :: Int) ->
case w_se2T of { I# ww1_se2W ->
joinrec {
$wloop2_se2S [InlPrag=[0], Occ=LoopBreaker] :: Int# -> Int# -> Int
[LclId[JoinId(2)], Arity=2, Str=<S,U><S,U>m, Unf=OtherCon []]
$wloop2_se2S (ww2_se2M :: Int#) (ww3_se2Q :: Int#)
= case tagToEnum# @ Bool (># ww3_se2Q ww1_se2W) of {
False ->
case remInt# ww3_se2Q 2# of {
__DEFAULT -> jump $wloop2_se2S ww2_se2M (+# ww3_se2Q 1#);
0# ->
jump $wloop2_se2S (+# ww2_se2M (*# ww3_se2Q 2#)) (+# ww3_se2Q 1#)
};
True -> GHC.Types.I# ww2_se2M
}; } in
jump $wloop2_se2S 0# 1#
}
List
Main.$wfuncs3
= \ (ww_se2l :: Int#) ->
case tagToEnum# @ Bool (># 1# ww_se2l) of {
False ->
joinrec {
$wgo_se2h [InlPrag=[0], Occ=LoopBreaker] :: Int# -> Int# -> Int#
[LclId[JoinId(2)], Arity=2, Str=<S,U><S,U>, Unf=OtherCon []]
$wgo_se2h (w_se2b :: Int#) (ww1_se2f :: Int#)
= case remInt# w_se2b 2# of {
__DEFAULT ->
case tagToEnum# @ Bool (==# w_se2b ww_se2l) of {
False -> jump $wgo_se2h (+# w_se2b 1#) ww1_se2f;
True -> ww1_se2f
};
0# ->
case tagToEnum# @ Bool (==# w_se2b ww_se2l) of {
False ->
jump $wgo_se2h (+# w_se2b 1#) (+# ww1_se2f (*# w_se2b 2#));
True -> +# ww1_se2f (*# w_se2b 2#)
}
}; } in
jump $wgo_se2h 1# 0#;
True -> 0#
}
Cheating
Main.main60
= \ (w_se0B :: Int) ->
case w_se0B of { I# ww1_se0E ->
let {
high_se6K [Dmd=<S,U>] :: Int#
[LclId]
high_se6K = *# ww1_se0E 2# } in
joinrec {
$wloop2_se0A [InlPrag=[0], Occ=LoopBreaker] :: Int# -> Int# -> Int
[LclId[JoinId(2)], Arity=2, Str=<S,U><S,U>m, Unf=OtherCon []]
$wloop2_se0A (ww2_se0u :: Int#) (ww3_se0y :: Int#)
= case tagToEnum# @ Bool (<=# ww3_se0y high_se6K) of {
False -> GHC.Types.I# ww2_se0u;
True -> jump $wloop2_se0A (+# ww2_se0u ww3_se0y) (+# ww3_se0y 4#)
}; } in
jump $wloop2_se0A 0# 4#
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment