Last active
July 12, 2017 17:30
-
-
Save jmspiewak/87ccfe0e20c05cb0114c90d26ae23a7c to your computer and use it in GitHub Desktop.
Iterators: GHC 8.0 vs 8.2
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
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) | |
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
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) |
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
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) | |
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
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) |
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
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