RFC: Add HasCallStack constraint to partial Data.List functions.

I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty: - head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!) --- The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019) and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html --- My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list. --- In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833 After accepting few changed test outputs, no further changes were needed. --- Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument.
I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty. More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable. Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions
Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial. I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833 --- Let me go through other comments in previous discussions, to have fuller overview. --- Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561 --- Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack!
This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution. --- In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this.
This email is indeed a request for CLC to comment. --- Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns.
The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
--- David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course).
In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up. Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions.
I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway).
That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked). --- Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable.
-xc requires recompiling the program for profiling. He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity.
If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good. For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have. Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
--- People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/` The performance metrics in MR do not regress. GHC is not slowed down. I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means: - allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03% And also using `--perf` (without `-j`): - perf instructions: +0.02% - perf cycles: -0.80% I don't know if this in bounds of "small changes to GHC". For me this looks acceptable. --- There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake. --- In summary: - fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion. Discussion period one month, until 2021-06-30 (end of June this year). Oleg [1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html --- # bytes allocated +-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+ # instructions +-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+ # LLC cache misses +-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+ # L1 cache misses +-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+ # perf instructions +-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+ # perf cycles +-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+

Thanks Oleg, this is extremely thorough. I appreciate the attention to
every point of contention. I'm in favour of this, and more so after this
email.
On Sun, May 30, 2021, 08:55 Oleg Grenrus
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument.
I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions
Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack!
This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this.
This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns.
The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
---
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course).
In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions.
I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway).
That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable.
-xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity.
If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
---
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018.
https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g.
https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

+1 Such a change is very welcome! --Andreas On 2021-05-30 15:52, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument.
I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions
Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack!
This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this.
This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns.
The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
---
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course).
In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions.
I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway).
That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable.
-xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity.
If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
---
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

As can probably be gathered from the tone of my earlier comment that was
cherry picked in Oleg's post, I'm +1 on this. It is a small improvement we
can make in the user experience at very little cost, bringing us one step
closer to the baseline functionality folks expect of most any language
these days.
-Edward
On Sun, May 30, 2021 at 10:54 AM Andreas Abel
+1 Such a change is very welcome! --Andreas
On 2021-05-30 15:52, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument.
I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions
Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack!
This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this.
This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns.
The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
---
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course).
In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions.
I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway).
That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable.
-xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity.
If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
---
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018.
https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra...
referencing e.g.
https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:...
and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

This is a fantastic suggestion; thank you, Oleg! On 5/30/21 9:52 AM, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument. I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack! This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this. This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns. The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course). In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions. I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway). That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable. -xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity. If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Yeah. This sounds reasonable to me. On Sun, May 30, 2021 at 4:08 PM Ryan Trinkle via Libraries < libraries@haskell.org> wrote:
This is a fantastic suggestion; thank you, Oleg!
On 5/30/21 9:52 AM, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument. I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack! This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this. This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns. The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course). In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions. I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway). That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable. -xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity. If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018.
https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra...
referencing e.g.
https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:...
and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

+1
Am Mo., 31. Mai 2021 um 00:04 Uhr schrieb Carter Schonwald
Yeah. This sounds reasonable to me.
On Sun, May 30, 2021 at 4:08 PM Ryan Trinkle via Libraries
wrote: This is a fantastic suggestion; thank you, Oleg!
On 5/30/21 9:52 AM, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument. I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack! This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this. This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns. The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course). In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions. I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway). That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable. -xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity. If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Hi,
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
(Strong) -1 from me. Reasons: It's been well known for close to three decades(!) that it is perfectly possible to add sophisticated debugging support to lazy languages like Haskell without impacting on the language semantics or formulation of its libraries. The existing tracing and profiling mechanisms of GHC are examples of this. Thus, letting one particular debugging mechanism becoming manifest at the type level of standard library functions is both very worrying and hugely disappointing. Especially when predicated on the compiler and specific aspects of the implementation strategy being sufficiently sophisticated to mitigate the runtime overhead. Moreover, the proposal is extremely partial. E.g. what about types like Maybe or Either, with functions fromJust/fromLeft/fromRight? Or integers and division? Or arrays and array indexing? And the list goes on. Once this first step has been taken, I fear it is only matter of time before we have constraints like this all over the core libraries. Is there a principled end-point to this? I cannot see one. Further, as far as I could see, the impact of the scheme also relies on cooperation of library authors, raising questions about just how much practical benefit the proposal would bring. It also appears that the impact on teaching has not been considered. Haskell's type classes are already often cited as a major impediment when using Haskell as a medium of instructions for beginners because it is quite difficult to teach the basics without also giving quite a comprehensive introduction to type classes, which makes for a steep initial learning step. Possibly too steep, in the opinion of many educators. And even if a carefully structured narrative can minimize what needs to be covered about type classes initially, students will inevitably come across them as soon as they try their hand at writing some actual code. The present proposal already exacerbate this problem, and if the idea were to become even more widespread, e.g. to provide good stack traces also for division by zero, out of bounds errors, or attempts to get something out of Nothing, it would be even worse. While the value of decent stack traces is undisputed, this is definitely the wrong way to go about addressing that issue. And the objection is not about letting the perfect be the enemy of the good, as suggested somewhere in the preceding discussions, but about not letting the manifestly imperfect getting a de facto irreversible foothold and then spreading from there. Best, /Henrik This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.

I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell. The use of partial functions in library code has been one of the few consistent sources of multi-day debugging exercises in Haskell that I've seen, and even cutting that down in an ad-hoc way would be valuable, since there are probably a dozen functions that account for 80% of the debugging hours (I'd certainly like to see fromJust on that list, for example). I agree with your point about education, but I do wonder whether these functions should be taught at all. What is their purpose, really? I've found little downside (and a lot of upside) to simply never using any of these functions. (The times when I get bitten by them are when they are used in libraries I use.) On 5/31/21 11:10 AM, Henrik Nilsson wrote:
Hi,
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
(Strong) -1 from me.
Reasons:
It's been well known for close to three decades(!) that it is perfectly possible to add sophisticated debugging support to lazy languages like Haskell without impacting on the language semantics or formulation of its libraries. The existing tracing and profiling mechanisms of GHC are examples of this.
Thus, letting one particular debugging mechanism becoming manifest at the type level of standard library functions is both very worrying and hugely disappointing. Especially when predicated on the compiler and specific aspects of the implementation strategy being sufficiently sophisticated to mitigate the runtime overhead.
Moreover, the proposal is extremely partial. E.g. what about types like Maybe or Either, with functions fromJust/fromLeft/fromRight? Or integers and division? Or arrays and array indexing? And the list goes on.
Once this first step has been taken, I fear it is only matter of time before we have constraints like this all over the core libraries. Is there a principled end-point to this? I cannot see one.
Further, as far as I could see, the impact of the scheme also relies on cooperation of library authors, raising questions about just how much practical benefit the proposal would bring.
It also appears that the impact on teaching has not been considered. Haskell's type classes are already often cited as a major impediment when using Haskell as a medium of instructions for beginners because it is quite difficult to teach the basics without also giving quite a comprehensive introduction to type classes, which makes for a steep initial learning step. Possibly too steep, in the opinion of many educators. And even if a carefully structured narrative can minimize what needs to be covered about type classes initially, students will inevitably come across them as soon as they try their hand at writing some actual code.
The present proposal already exacerbate this problem, and if the idea were to become even more widespread, e.g. to provide good stack traces also for division by zero, out of bounds errors, or attempts to get something out of Nothing, it would be even worse.
While the value of decent stack traces is undisputed, this is definitely the wrong way to go about addressing that issue. And the objection is not about letting the perfect be the enemy of the good, as suggested somewhere in the preceding discussions, but about not letting the manifestly imperfect getting a de facto irreversible foothold and then spreading from there.
Best,
/Henrik
This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

On Mon, 31 May 2021, Ryan Trinkle via Libraries wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell. The use of partial functions in library code has been one of the few consistent sources of multi-day debugging exercises in Haskell that I've seen, and even cutting that down in an ad-hoc way would be valuable, since there are probably a dozen functions that account for 80% of the debugging hours (I'd certainly like to see fromJust on that list, for example).
I understand the proposal as tagging all partial functions in a compiler accessible way, in order to tell the user: Don't use that function! If so, then we should make sure that every such tagged function has a total counterpart.

I think the vast majority of the functions presented in this proposal have a total counterpart, whether it is a function or a code pattern. We have NonEmpty in `base`, as well as ExceptT/MonadError and Exceptions to allow us to mimic such a cul-de-sac in the code with appropriate annotations around it. Le 31/05/2021 à 18:15, Henning Thielemann a écrit :
On Mon, 31 May 2021, Ryan Trinkle via Libraries wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell. The use of partial functions in library code has been one of the few consistent sources of multi-day debugging exercises in Haskell that I've seen, and even cutting that down in an ad-hoc way would be valuable, since there are probably a dozen functions that account for 80% of the debugging hours (I'd certainly like to see fromJust on that list, for example).
I understand the proposal as tagging all partial functions in a compiler accessible way, in order to tell the user: Don't use that function!
If so, then we should make sure that every such tagged function has a total counterpart.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
-- Hécate ✨ 🐦: @TechnoEmpress IRC: Hecate WWW: https://glitchbra.in RUN: BSD

I like this avenue of thought! I would suggest the following:
Step 1: Accept this proposal.
Step 2: Introduce more *educational* error messages in the exceptions.
Instead of "error: empty list", for example, it could be "error: unguarded
use of head has failed".
Sorry for phone-brevity.
On Mon, 31 May 2021, 19.31 Hécate,
I think the vast majority of the functions presented in this proposal have a total counterpart, whether it is a function or a code pattern. We have NonEmpty in `base`, as well as ExceptT/MonadError and Exceptions to allow us to mimic such a cul-de-sac in the code with appropriate annotations around it.
Le 31/05/2021 à 18:15, Henning Thielemann a écrit :
On Mon, 31 May 2021, Ryan Trinkle via Libraries wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell. The use of partial functions in library code has been one of the few consistent sources of multi-day debugging exercises in Haskell that I've seen, and even cutting that down in an ad-hoc way would be valuable, since there are probably a dozen functions that account for 80% of the debugging hours (I'd certainly like to see fromJust on that list, for example).
I understand the proposal as tagging all partial functions in a compiler accessible way, in order to tell the user: Don't use that function!
If so, then we should make sure that every such tagged function has a total counterpart.
_______________________________________________ Libraries mailing listLibraries@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
-- Hécate ✨ 🐦: @TechnoEmpress IRC: Hecate WWW: https://glitchbra.in RUN: BSD
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

fromJust, mentioned in the thread couple of times, has had the HasCallStack constraint since (I think) GHC 8.8.1. As for educational uses, it's been clear for a while now that industrial uses are at odds with educational ones (and both may be at odds with research ones). In my opinion, we can't hold back one for another. Rather, we need to figure out the right story for both. There's a (seemingly) valid industrial use case for the HasCallStack mechanism in base that is not covered by -xc, as explained by others above. As for education, two possible avenues are 1) to explore custom "educational" Preludes (tried by several people, the CodeWorld project first comes to mind), and 2) custom error messages, which are being reworked just as we speak by Richard, Alfredo and others. -- Kind regards, Artem On Mon, May 31, 2021, 12:10 PM Ryan Trinkle via Libraries < libraries@haskell.org> wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell. The use of partial functions in library code has been one of the few consistent sources of multi-day debugging exercises in Haskell that I've seen, and even cutting that down in an ad-hoc way would be valuable, since there are probably a dozen functions that account for 80% of the debugging hours (I'd certainly like to see fromJust on that list, for example).
I agree with your point about education, but I do wonder whether these functions should be taught at all. What is their purpose, really? I've found little downside (and a lot of upside) to simply never using any of these functions. (The times when I get bitten by them are when they are used in libraries I use.)
On 5/31/21 11:10 AM, Henrik Nilsson wrote:
Hi,
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
(Strong) -1 from me.
Reasons:
It's been well known for close to three decades(!) that it is perfectly possible to add sophisticated debugging support to lazy languages like Haskell without impacting on the language semantics or formulation of its libraries. The existing tracing and profiling mechanisms of GHC are examples of this.
Thus, letting one particular debugging mechanism becoming manifest at the type level of standard library functions is both very worrying and hugely disappointing. Especially when predicated on the compiler and specific aspects of the implementation strategy being sufficiently sophisticated to mitigate the runtime overhead.
Moreover, the proposal is extremely partial. E.g. what about types like Maybe or Either, with functions fromJust/fromLeft/fromRight? Or integers and division? Or arrays and array indexing? And the list goes on.
Once this first step has been taken, I fear it is only matter of time before we have constraints like this all over the core libraries. Is there a principled end-point to this? I cannot see one.
Further, as far as I could see, the impact of the scheme also relies on cooperation of library authors, raising questions about just how much practical benefit the proposal would bring.
It also appears that the impact on teaching has not been considered. Haskell's type classes are already often cited as a major impediment when using Haskell as a medium of instructions for beginners because it is quite difficult to teach the basics without also giving quite a comprehensive introduction to type classes, which makes for a steep initial learning step. Possibly too steep, in the opinion of many educators. And even if a carefully structured narrative can minimize what needs to be covered about type classes initially, students will inevitably come across them as soon as they try their hand at writing some actual code.
The present proposal already exacerbate this problem, and if the idea were to become even more widespread, e.g. to provide good stack traces also for division by zero, out of bounds errors, or attempts to get something out of Nothing, it would be even worse.
While the value of decent stack traces is undisputed, this is definitely the wrong way to go about addressing that issue. And the objection is not about letting the perfect be the enemy of the good, as suggested somewhere in the preceding discussions, but about not letting the manifestly imperfect getting a de facto irreversible foothold and then spreading from there.
Best,
/Henrik
This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Hi, Ryan Trinkle wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell.
The sad irony of changes like the proposed one is, of course, that they make a systematic solution less likely to happen (the systematic solution in this case being some engineering effort around the existing -xc mechanism to lower the cost and hassle of using it, which seems to be the reason is it judged not to suffice at present).
I agree with your point about education, but I do wonder whether these functions should be taught at all. What is their purpose, really? I've found little downside (and a lot of upside) to simply never using any of these functions. (The times when I get bitten by them are when they are used in libraries I use.)
I'd personally not like to suggest to educators what they should or should not teach: the context, specific learning goals, and students vary widely. In any case, these functions have been in Haskell since its inception, and so are deeply ingrained in books, literature, and code. Moreover, I do not find functions like (!!) or foldl1 to be unreasonable at all. List indexing is as reasonable as array indexing. And foldl1 and foldr1 are very useful when folding over lists where the type of the elements have no neutral element. In my day to day work, we also avoid using these partial functions whenever we can, and usually it is not that difficult. But every now and then the reason, say, a list is non-empty is just a little bit too subtle to capture in a reasonable way (benefit outweighing the cost) by a suitable design and/or at the type level, and the use of functions like foldl1 is entirely appropriate, along with a comment in the code explaining why it is safe. Hécate wrote:
I think the vast majority of the functions presented in this proposal have a total counterpart, whether it is a function or a code pattern. We have NonEmpty in `base`, as well as ExceptT/MonadError and Exceptions to allow us to mimic such a cul-de-sac in the code with appropriate annotations around it.
While NonEmpty is useful on occasion, many operations on them of course returns a possibly empty list, and then the original problem is back. And having to resort to monadic code when it is completely clear that a piece of code using, say, a foldl1 or (!!) is safe, can be quite costly (major refactoring could be implied) as well as obscuring the nature and purpose of the code. So, again, while partial functions obviously should be use with great care, they certainly have perfectly legitimate uses in a practical setting in most languages in wide-spread use, including Haskell, and I'd again be somewhat wary of "tell the user: Don't use that function!" as Henning phrased it. Artem Pelenitsyn wrote:
As for educational uses, it's been clear for a while now that industrial uses are at odds with educational ones (and both may be at odds with research ones). In my opinion, we can't hold back one for another. Rather, we need to figure out the right story for both. There's a (seemingly) valid industrial use case for the HasCallStack mechanism in base that is not covered by -xc, as explained by others above. As for education, two possible avenues are 1) to explore custom "educational" Preludes (tried by several people, the CodeWorld project first comes to mind), and 2) custom error messages, which are being reworked just as we speak by Richard, Alfredo and others.
Different preludes for different classes of users are brought up from time to time. I think there are significant down-sides to this. And further, I am not at all convinced that "industrial users" are such a homogeneous group that they'd all agree on what they'd want in the prelude. Both of these suggest than rather than a separate prelude for education/beginners, the standard prelude should be kept simple/be left alone, and groups with specific needs and sufficient knowledge should pay the price for using refined preludes if they make an informed choice that the benefits of doing so outweigh the costs. But I digress. /Henrik This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.

Hi Henrik, Regarding making systemic improvements less likely: I don't think we should choose to bear costs, simply because the pain of those costs may potentially motivate us to come up with something better. If Oleg's proposed solution actually makes it *harder* for -xc improvements to be made, then I would certainly agree that we shouldn't use it as a stopgap. Regarding teaching: although I don't want to usurp the role of the educator - and it would be fantastic to get some input from actual educators on this thread - I don't think we should simply say that because these things exist, their teachability is important. Let's let people tell us, specifically, that they consider `head` to be important to teaching students, and why, and then we can make sure it's suitable for them. I agree that partiality is sometimes necessary in real-world code, although we have gotten very far at Obsidian with banning partial functions like foldl1 in favor of explicit calls to `error`, which are typically O(1) more work for the developer, and effectively encodes the comment you mentioned for why it is safe (i.e. by saying why the error ought to be impossible). That also means that, when the developer is wrong about the impossibility of the condition, which seems to be a fairly common occurrence, there is at least some hope of tracking down the production error message to something meaningful. Best, Ryan On 6/1/21 2:57 AM, Henrik Nilsson wrote:
Hi,
Ryan Trinkle wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell.
The sad irony of changes like the proposed one is, of course, that they make a systematic solution less likely to happen (the systematic solution in this case being some engineering effort around the existing -xc mechanism to lower the cost and hassle of using it, which seems to be the reason is it judged not to suffice at present).
I agree with your point about education, but I do wonder whether these functions should be taught at all. What is their purpose, really? I've found little downside (and a lot of upside) to simply never using any of these functions. (The times when I get bitten by them are when they are used in libraries I use.)
I'd personally not like to suggest to educators what they should or should not teach: the context, specific learning goals, and students vary widely.
In any case, these functions have been in Haskell since its inception, and so are deeply ingrained in books, literature, and code.
Moreover, I do not find functions like (!!) or foldl1 to be unreasonable at all. List indexing is as reasonable as array indexing. And foldl1 and foldr1 are very useful when folding over lists where the type of the elements have no neutral element.
In my day to day work, we also avoid using these partial functions whenever we can, and usually it is not that difficult. But every now and then the reason, say, a list is non-empty is just a little bit too subtle to capture in a reasonable way (benefit outweighing the cost) by a suitable design and/or at the type level, and the use of functions like foldl1 is entirely appropriate, along with a comment in the code explaining why it is safe.
Hécate wrote:
I think the vast majority of the functions presented in this proposal have a total counterpart, whether it is a function or a code pattern. We have NonEmpty in `base`, as well as ExceptT/MonadError and Exceptions to allow us to mimic such a cul-de-sac in the code with appropriate annotations around it.
While NonEmpty is useful on occasion, many operations on them of course returns a possibly empty list, and then the original problem is back.
And having to resort to monadic code when it is completely clear that a piece of code using, say, a foldl1 or (!!) is safe, can be quite costly (major refactoring could be implied) as well as obscuring the nature and purpose of the code.
So, again, while partial functions obviously should be use with great care, they certainly have perfectly legitimate uses in a practical setting in most languages in wide-spread use, including Haskell, and I'd again be somewhat wary of "tell the user: Don't use that function!" as Henning phrased it.
Artem Pelenitsyn wrote:
As for educational uses, it's been clear for a while now that industrial uses are at odds with educational ones (and both may be at > odds with research ones). In my opinion, we can't hold back one for another. Rather, we need to figure out the right story for both. There's a (seemingly) valid industrial use case for the HasCallStack mechanism in base that is not covered by -xc, as explained by others above. As for education, two possible avenues are 1) to explore custom "educational" Preludes (tried by several people, the CodeWorld > project first comes to mind), and 2) custom error messages, which are > being reworked just as we speak by Richard, Alfredo and others.
Different preludes for different classes of users are brought up from time to time.
I think there are significant down-sides to this. And further, I am not at all convinced that "industrial users" are such a homogeneous group that they'd all agree on what they'd want in the prelude.
Both of these suggest than rather than a separate prelude for education/beginners, the standard prelude should be kept simple/be left alone, and groups with specific needs and sufficient knowledge should pay the price for using refined preludes if they make an informed choice that the benefits of doing so outweigh the costs.
But I digress.
/Henrik
This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

On 6/1/21 2:57 AM, Henrik Nilsson wrote:
But every now and then the reason, say, a list is non-empty is just a little bit too subtle to capture in a reasonable way ..., and the use of functions like foldl1 is entirely appropriate, along with a comment in the code explaining why it is safe.
A bit off topic (my apologies for the hijacking), but if you my fellow Haskellers think you understand when the use of such a partial function is safe, I challenge you to look at: https://gitlab.haskell.org/ghc/ghc/-/issues/19917 I thought that e.g. `last (x : xs)` can never throw the error `Prelude.last: empty list` but I had to learn otherwise... (So my conviction is that `List.head`, `List.last` and the like should be eradicated entirely and any step that brings us closer to this goal gets my approval.) On 2021-06-01 11:20, Ryan Trinkle via Libraries wrote:
Hi Henrik,
Regarding making systemic improvements less likely: I don't think we should choose to bear costs, simply because the pain of those costs may potentially motivate us to come up with something better. If Oleg's proposed solution actually makes it *harder* for -xc improvements to be made, then I would certainly agree that we shouldn't use it as a stopgap.
Regarding teaching: although I don't want to usurp the role of the educator - and it would be fantastic to get some input from actual educators on this thread - I don't think we should simply say that because these things exist, their teachability is important. Let's let people tell us, specifically, that they consider `head` to be important to teaching students, and why, and then we can make sure it's suitable for them.
I agree that partiality is sometimes necessary in real-world code, although we have gotten very far at Obsidian with banning partial functions like foldl1 in favor of explicit calls to `error`, which are typically O(1) more work for the developer, and effectively encodes the comment you mentioned for why it is safe (i.e. by saying why the error ought to be impossible). That also means that, when the developer is wrong about the impossibility of the condition, which seems to be a fairly common occurrence, there is at least some hope of tracking down the production error message to something meaningful.
Best,
Ryan
On 6/1/21 2:57 AM, Henrik Nilsson wrote:
Hi,
Ryan Trinkle wrote:
I certainly agree that a more systemic solution would be preferable. However, none have been forthcoming in the 15 or so years I've been using Haskell.
The sad irony of changes like the proposed one is, of course, that they make a systematic solution less likely to happen (the systematic solution in this case being some engineering effort around the existing -xc mechanism to lower the cost and hassle of using it, which seems to be the reason is it judged not to suffice at present).
I agree with your point about education, but I do wonder whether these functions should be taught at all. What is their purpose, really? I've found little downside (and a lot of upside) to simply never using any of these functions. (The times when I get bitten by them are when they are used in libraries I use.)
I'd personally not like to suggest to educators what they should or should not teach: the context, specific learning goals, and students vary widely.
In any case, these functions have been in Haskell since its inception, and so are deeply ingrained in books, literature, and code.
Moreover, I do not find functions like (!!) or foldl1 to be unreasonable at all. List indexing is as reasonable as array indexing. And foldl1 and foldr1 are very useful when folding over lists where the type of the elements have no neutral element.
In my day to day work, we also avoid using these partial functions whenever we can, and usually it is not that difficult. But every now and then the reason, say, a list is non-empty is just a little bit too subtle to capture in a reasonable way (benefit outweighing the cost) by a suitable design and/or at the type level, and the use of functions like foldl1 is entirely appropriate, along with a comment in the code explaining why it is safe.
Hécate wrote:
I think the vast majority of the functions presented in this proposal have a total counterpart, whether it is a function or a code pattern. We have NonEmpty in `base`, as well as ExceptT/MonadError and Exceptions to allow us to mimic such a cul-de-sac in the code with appropriate annotations around it.
While NonEmpty is useful on occasion, many operations on them of course returns a possibly empty list, and then the original problem is back.
And having to resort to monadic code when it is completely clear that a piece of code using, say, a foldl1 or (!!) is safe, can be quite costly (major refactoring could be implied) as well as obscuring the nature and purpose of the code.
So, again, while partial functions obviously should be use with great care, they certainly have perfectly legitimate uses in a practical setting in most languages in wide-spread use, including Haskell, and I'd again be somewhat wary of "tell the user: Don't use that function!" as Henning phrased it.
Artem Pelenitsyn wrote:
As for educational uses, it's been clear for a while now that industrial uses are at odds with educational ones (and both may be at > odds with research ones). In my opinion, we can't hold back one for another. Rather, we need to figure out the right story for both. There's a (seemingly) valid industrial use case for the HasCallStack mechanism in base that is not covered by -xc, as explained by others above. As for education, two possible avenues are 1) to explore custom "educational" Preludes (tried by several people, the CodeWorld > project first comes to mind), and 2) custom error messages, which are > being reworked just as we speak by Richard, Alfredo and others.
Different preludes for different classes of users are brought up from time to time.
I think there are significant down-sides to this. And further, I am not at all convinced that "industrial users" are such a homogeneous group that they'd all agree on what they'd want in the prelude.
Both of these suggest than rather than a separate prelude for education/beginners, the standard prelude should be kept simple/be left alone, and groups with specific needs and sufficient knowledge should pay the price for using refined preludes if they make an informed choice that the benefits of doing so outweigh the costs.
But I digress.
/Henrik
This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

On Tue, Jun 01, 2021 at 08:50:43PM +0200, Andreas Abel wrote:
On 6/1/21 2:57 AM, Henrik Nilsson wrote:
But every now and then the reason, say, a list is non-empty is just a little bit too subtle to capture in a reasonable way ..., and the use of functions like foldl1 is entirely appropriate, along with a comment in the code explaining why it is safe.
A bit off topic (my apologies for the hijacking), but if you my fellow Haskellers think you understand when the use of such a partial function is safe, I challenge you to look at:
https://gitlab.haskell.org/ghc/ghc/-/issues/19917
I thought that e.g. `last (x : xs)` can never throw the error `Prelude.last: empty list` but I had to learn otherwise...
(So my conviction is that `List.head`, `List.last` and the like should be eradicated entirely and any step that brings us closer to this goal gets my approval.)
Wow, this is *very* interesting. So when someone grumbles
I got the very unhelpful error message "Prelude.last: empty list" and I can't even see how an empty list can have entered my program
they may be completely correct: the error can be printed when there is no empty list at all! Tom

Hi, On 06/01/2021 07:50 PM, Andreas Abel wrote:
A bit off topic (my apologies for the hijacking), but if you my fellow Haskellers think you understand when the use of such a partial function is safe, I challenge you to look at:
https://gitlab.haskell.org/ghc/ghc/-/issues/19917
I thought that e.g. `last (x : xs)` can never throw the error `Prelude.last: empty list` but I had to learn otherwise...
Off topic, yes. The above statement is a bit disingenuous, though. As clearly explained when looking into the details, your snippet is absolutely fine in isolation. But in a context where a program fragment statically can be proved to fail, an optimizing compiler can decide that one bottom is as good as any other, and thus it can fail for a different reason than we might think it should. I have zero problems with that personally, and would not hesitate explain that to students either as it makes perfect sense once we accept that the compiler is not bound to a specific evaluation order as long as the overall outcome is not changed. And having the freedom to leave evaluation details, for the most part, to the compiler is what always attracted me to Haskell and still does, (three decades or so later, including plenty of "real-world" experience) And something I try to convey to my students. But I know that many feel very different about this particular point. In any case, the problem has very little to do with head, tail, last as such, so staying away from those specific functions is certainly not enough to guarantee no surprises. And besides those, there are other perfectly reasonable functions like (!!) and foldr1 that I'd definitely would not say never should be used, just as I would not say that array indexing or integer divisions must be shunned because they are partial. Best, /Henrik This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.

On Fri, Jun 4, 2021, 12:12 PM Henrik Nilsson < Henrik.Nilsson@nottingham.ac.uk> wrote:
And besides those, there are other perfectly reasonable functions like (!!) and foldr1 that I'd definitely would not say never should be used, just as I would not say that array indexing or integer divisions must be shunned because they are partial.
FWIW, I think (!!) tends to show up an awful lot (maybe mostly) in code written by beginners who aren't yet thinking of lists structurally. foldr1 is deceptive—it's easy to think it can do more than it can, and I've seen its laziness characteristics confuse even an experienced Haskeller. It's not even really nice for non-empty list types. Much clearer: fr1 :: (a -> b -> b) -> (a -> b) -> NonEmpty a -> b which is best matched to data NonEmpty a = End a | Cons a (NonEmpty a) but which can be adapted to Data.List.NonEmpty with a bit of laziness muddling.

David Feuer wrote:
FWIW, I think (!!) tends to show up an awful lot (maybe mostly) in code written by beginners who aren't yet thinking of lists structurally.
Well, I have no statistical evidence, but I'd disagree. I, at least, happily use (!!) when I judge it appropriate given its time complexity and other contextual factors. In any case, indexing on lists is just one instance. Many other data structures support indexing operations, including arrays, and they are all equally partial. On what grounds should list indexing be singled out?
foldr1 is deceptive—it's easy to think it can do more than it can, and I've seen its laziness characteristics confuse even an experienced Haskeller. It's not even really nice for non-empty list types. Much clearer:
fr1 :: (a -> b -> b) -> (a -> b) -> NonEmpty a -> b
which is best matched to
data NonEmpty a = End a | Cons a (NonEmpty a)
Fine if one happens to be working with NonEmpty. But NonEmpty has its own issues, in that it is often the case that one needs to mix lists with different properties, and formally keeping track of how these properties interact at the type level is often not feasible in Haskell, and may well not be worth the effort even in languages that have much more powerful type systems, depending on objectives and practical circumstances. So again, I disagree and maintain that foldr1 is entirely reasonable.
head and tail are basic ... in Lisp.
I don't think that is a fair statement. There are many data structures beside list for which head and tail are basic operations. Look in pretty much any book on data structures and algorithms. So taking head and tail for lists as a starting point makes perfect sense from a teaching perspective, for example. (And besides, there is nothing inherently wrong with Lisp and its descendants, and well-rounded Computer Scientists and programmers should certainly be aware.)
In Haskell, they're effectively used ... *checks notes* ... in the MonadFix instance for []. Almost every good use of (!!) is for something that really should use an infinite list
data Stream a = a :< Stream a
but that uses a list for convenience.
I'd be hesitant to make such sweeping statements myself: a lot depends on the specifics and practical tradeoffs of individual cases. But in any case, again, (!!) is only but one example of an indexing operation. Why should the list one be singled out? The array one is equally partial. The fundamental point here is that there is no underlying principle here, except that undeniably Haskell's more or less "built-in" lists are used a lot and therefore they of course account for many of the errors seen. A further point is that what amounts to operational debugging annotations really have no place being mixed into types, and fundamentally undermines the idea of declarative programming. I guess I am bit of an idealist in this respect, but I still think there is a lot of mileage in approaching Haskell as a declarative language, at least until circumstances dictate that a more operational understanding is needed as a complement. Best, /Henrik foldr1 is deceptive—it's easy to think it can do more than it can, and I've seen its laziness characteristics confuse even an experienced Haskeller. It's not even really nice for non-empty list types. Much clearer: fr1 :: (a -> b -> b) -> (a -> b) -> NonEmpty a -> b This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.

On Fri, 4 Jun 2021, Henrik Nilsson wrote:
And besides those, there are other perfectly reasonable functions like (!!) and foldr1 that I'd definitely would not say never should be used, just as I would not say that array indexing or integer divisions must be shunned because they are partial.
I prefer to replace (xs!!k) by case drop k xs of [] -> defaultX x:_ -> x or do not use indexing on lists, at all, because of performance reasons. I use foldr1 only on non-empty lists. Division by non-zero divisors would be nice to have, but currently we can only have it with Liquid Haskell.

Hi, On 06/04/2021 09:57 PM, Henning Thielemann wrote:
On Fri, 4 Jun 2021, Henrik Nilsson wrote:
And besides those, there are other perfectly reasonable functions like (!!) and foldr1 that I'd definitely would not say never should be used, just as I would not say that array indexing or integer divisions must be shunned because they are partial.
I prefer to replace (xs!!k) by
case drop k xs of [] -> defaultX x:_ -> x
Entirely reasonable in many cases. Which does not make (!!) universally unreasonable. Let developers, educators, and others make their own informed choices and adopt their own informed policies depending on their specific context and needs. Best, /Henrik This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.

Hi Ryan,
Regarding making systemic improvements less likely: I don't think we should choose to bear costs, simply because the pain of those costs may potentially motivate us to come up with something better. If Oleg's proposed solution actually makes it *harder* for -xc improvements to be made, then I would certainly agree that we shouldn't use it as a stopgap.
Fair point about not choose to bear costs *just* in the hope something better comes along. My main point was that the suggested approach in my opinion is too un-principled and too partial to have much appeal, especially when it is clear that solutions that are both principled and complete do exist, and that most of the required machinery is already in place. But others clearly disagree, although, in part for reasons that has more to do with philosophy of language design and partiality vs. totality, than the practical need to pinpoint the site of errors in programs in a language that was designed to allow partial functions.
Regarding teaching: although I don't want to usurp the role of the educator - and it would be fantastic to get some input from actual educators on this thread -
Just for the record, I have one feet solidly in each of the educational and industrial camps.
I don't think we should simply say that because these things exist, their teachability is important. Let's let people tell us, specifically, that they consider `head` to be important to teaching students, and why, and then we can make sure it's suitable for them.
Well, head and tail *are* basic. There are no two ways about that. But there were also other affected functions, like list indexing, or indexing into other collection types, that I at least consider entirely reasonable (as long as the time complexity is taken into account properly when that is a consideration). The basic points I were making, to recap and rephrase, were that a) Type classes in general are considered a bit of a hurdle when teaching beginners. Thus, more of them (for basic functions) is not helpful. b) I don't find mixing what amounts to operational annotations to assist with particular approaches to debugging into the types of functions to be appealing at all. In fact, I feel rather strongly that it is a fundamentally flawed approach. The types should tell me something important about what things are. Not about how to go about debugging them. Best, /Henrik This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment. Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.

head and tail are basic ... in Lisp. In Haskell, they're effectively used ... *checks notes* ... in the MonadFix instance for []. Almost every good use of (!!) is for something that really should use an infinite list data Stream a = a :< Stream a but that uses a list for convenience. On Fri, Jun 4, 2021, 12:50 PM Henrik Nilsson < Henrik.Nilsson@nottingham.ac.uk> wrote:
Hi Ryan,
Regarding making systemic improvements less likely: I don't think we should choose to bear costs, simply because the pain of those costs may potentially motivate us to come up with something better. If Oleg's proposed solution actually makes it *harder* for -xc improvements to be made, then I would certainly agree that we shouldn't use it as a stopgap.
Fair point about not choose to bear costs *just* in the hope something better comes along. My main point was that the suggested approach in my opinion is too un-principled and too partial to have much appeal, especially when it is clear that solutions that are both principled and complete do exist, and that most of the required machinery is already in place.
But others clearly disagree, although, in part for reasons that has more to do with philosophy of language design and partiality vs. totality, than the practical need to pinpoint the site of errors in programs in a language that was designed to allow partial functions.
Regarding teaching: although I don't want to usurp the role of the educator - and it would be fantastic to get some input from actual educators on this thread -
Just for the record, I have one feet solidly in each of the educational and industrial camps.
I don't think we should simply say that because these things exist, their teachability is important. Let's let people tell us, specifically, that they consider `head` to be important to teaching students, and why, and then we can make sure it's suitable for them.
Well, head and tail *are* basic. There are no two ways about that. But there were also other affected functions, like list indexing, or indexing into other collection types, that I at least consider entirely reasonable (as long as the time complexity is taken into account properly when that is a consideration).
The basic points I were making, to recap and rephrase, were that
a) Type classes in general are considered a bit of a hurdle when teaching beginners. Thus, more of them (for basic functions) is not helpful.
b) I don't find mixing what amounts to operational annotations to assist with particular approaches to debugging into the types of functions to be appealing at all.
In fact, I feel rather strongly that it is a fundamentally flawed approach.
The types should tell me something important about what things are. Not about how to go about debugging them.
Best,
/Henrik
This message and any attachment are intended solely for the addressee and may contain confidential information. If you have received this message in error, please contact the sender and delete the email and attachment.
Any views or opinions expressed by the author of this email do not necessarily reflect the views of the University of Nottingham. Email communications with the University of Nottingham may be monitored where permitted by law.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

+1 on the proposal, however... On 2021-05-31 11:10 a.m., Henrik Nilsson wrote:
... (Strong) -1 from me.
Reasons:
It's been well known for close to three decades(!) that it is perfectly possible to add sophisticated debugging support to lazy languages like Haskell without impacting on the language semantics or formulation of its libraries. The existing tracing and profiling mechanisms of GHC are examples of this.
Thus, letting one particular debugging mechanism becoming manifest at the type level of standard library functions is both very worrying and hugely disappointing. Especially when predicated on the compiler and specific aspects of the implementation strategy being sufficiently sophisticated to mitigate the runtime overhead. ...
I agree with this point, even if I don't find it important enough to vote against the proposal. Adding a visible HasCallStack constraint to function signatures is a bad thing, because semantically it's nothing but noise. I'd like to propose using a new alias Partial instead. This would actually have some educational value, and it would provide some future opportunity to treat partial functions separately from other functions with the HasCallStack constraint. The compiler might issue a warning on their use, to start with, and they might not be considered a part of the SAFE subset of the language. The alternative alternative would be to leave this information out of the type signature and use a pragma {-# PARTIAL #-} or {-# CALLSTACK #-} instead. This however would take more effort to implement, and I actually like the idea of a clear, semantically meaningful, warning in the type signature.

+1, I think this is a strict improvement.
It also makes a good advertisement for the HasCallStack class.
2021年5月30日(日) 22:55 Oleg Grenrus
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument.
I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions
Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack!
This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this.
This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns.
The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
---
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course).
In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions.
I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway).
That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable.
-xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity.
If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
---
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018.
https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g.
https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

+1, thanks for your attention to detail Oleg.
Cheers,
George
On Sat, 5 Jun 2021 at 20:26, Fumiaki Kinoshita
+1, I think this is a strict improvement.
It also makes a good advertisement for the HasCallStack class.
2021年5月30日(日) 22:55 Oleg Grenrus
: I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument.
I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions
Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases.
Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack!
This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this.
This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns.
The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
---
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course).
In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions.
I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway).
That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable.
-xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity.
If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
---
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

The discussion period for this proposal have ended. The most meritorious counter-argument/proposal is using Partial constraint. [1] I don't have counterarguments which would allow me simply discard that. I encourage Richard and Henrik to pursue that plan. So I have decided to drop this, HasCallStack, proposal. - Oleg P.S. I'd like to have formal process (like in [2]), and make a body (CLC?) to decide whether the alterantives have merits, so the process would have chance to make progress. [1]: https://mail.haskell.org/pipermail/libraries/2021-June/031291.html [2]: https://mail.haskell.org/pipermail/libraries/2021-July/031339.html On 30.5.2021 16.52, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument. I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack! This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this. This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns. The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course). In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions. I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway). That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable. -xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity. If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

After rereading https://wiki.haskell.org/Library_submissions page it actually says:
Following discussion, it's the responsibility of the core libraries committee to determine if the proposal should be accepted. Send an email to the core libraries committee requesting a decision, optionally including your own summary of the mailing list discussion.
I submit this proposal to the core libraries committee. My summary is below: - there is (vague) Partial-constaint alternative proposal, which tries to discuss more elegant solution than to adding "operational" constraint to the functions. It's not concrete. - there are plenty of comments in support of HasCallStack too. So I ask the CLC to make a decision, whether HasCallStack is fine for now, or not. - Oleg On 5.7.2021 12.39, Oleg Grenrus wrote:
The discussion period for this proposal have ended.
The most meritorious counter-argument/proposal is using Partial constraint. [1] I don't have counterarguments which would allow me simply discard that.
I encourage Richard and Henrik to pursue that plan.
So I have decided to drop this, HasCallStack, proposal.
- Oleg
P.S. I'd like to have formal process (like in [2]), and make a body (CLC?) to decide whether the alterantives have merits, so the process would have chance to make progress.
[1]: https://mail.haskell.org/pipermail/libraries/2021-June/031291.html [2]: https://mail.haskell.org/pipermail/libraries/2021-July/031339.html
On 30.5.2021 16.52, Oleg Grenrus wrote:
I'm proposing to add HasCallStack constraint for partial functions in base package for functions in Data.List and Data.List.NonEmpty:
- head, tail, init, last, ... - foldr1, foldl1, maximum, minimum, ... - (!!)
---
The previous discussions started by Luo Chen can be found at https://gitlab.haskell.org/ghc/ghc/-/issues/17040 (from August 2019)
and libraries list from June 2019 https://mail.haskell.org/pipermail/libraries/2019-June/029652.html
---
My motivation comes from seeing GHCJS failing with "Prelude.!! negative index" exception and cabal-install with head of empty list.
---
In #17040 issue Ben Gamari comments [1]
In general, adding HasCallStack constraints on things like simple non-recursive functions like fromJust and head seems like a reasonable trade-off; these functions will essentially always inline and consequently the cost of the constraint will vanish. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
After accepting few changed test outputs, no further changes were needed.
---
Ben continues:
Adding HasCallStack constraints on typeclass-overloaded methods isn't as clear. After all, it's quite likely that these functions will be reached by dynamic dispatch which will become more expensive with the additional callstack argument. I agree. Foldable.foldr1 may not be partial, e.g. it isn't for NonEmpty.
More correct approach would be to add Foldable1 [2] class to base, and in some distant future remove potentially partial members from Foldable.
Therefore my patch _does not change_ Foldable.
nofib may not be a very good test for this patch as it doesn't contain many uses of the affected functions Indeed. These functions are hardly ever in tight performance critical code, thus I'm skeptical about they affecting a code written by performance aware people. Re-implementing `head` in a loop where it causes performance regression is trivial.
I have run `nofib` anyway. Results are at the end.
I think it would be a good idea to start with a minimal patch adding constraints to the simple cases. We should then verify that the patch doesn't affect the Core produced by typical use-cases (perhaps even adding tests such that these don't regress). Once we know that the simple cases are safe we can move on to the harder cases. Such patch is now available at https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5833
---
Let me go through other comments in previous discussions, to have fuller overview.
---
Some people are in favour, e.g. - Simon Jakobi, https://mail.haskell.org/pipermail/libraries/2019-June/029655.html - Hécate, https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_355561
---
Richard [3] thinks that e.g. a year prior addition of HasCallStack to fromJust [4] is not a right thing.
I don't have any particular insight to how to do call stacks better -- and I am swayed by the argument that we need call stacks even in production -- but I don't think HasCallStack is the way. That was always meant as just a small hack! This patch is indeed more pragmatic than elegant, but takes us from takes us from spending potentially many hours finding the source of a crash to being pointed at the very line where it happens directly, which is invaluable for production systems. I.e. let not (unknown) perfect be an enemy of good solution.
---
In fromJust issue discussion [4] Ben comments
However, I should emphasize to that we don't want to simply scatter HasCallStacks on every partial function. We should be thoughtful and deliberate (and probably consult with the CLC) when making changes like this. This email is indeed a request for CLC to comment.
---
Edward Kmett comments was in favour [5]
I’m starting to warm to the idea of putting HasCallStack constraints on the obviously partial combinators in base if we can demonstrate that the performance impact isn't bad in practice, and even really, to some extent if there is a somewhat middling impact on the performance of code that leans on these hard to debug combinators, so long as the performance of their more total siblings remains unaffected. The impact on the perceived debuggability of Haskell seems _likely_ to significantly outweigh the performance concerns. The results (to follow) shows that impact isn't bad.
Heck, off of the HEAD of cabal, which we’re encouraging folks to build to play with the ghc 8.8.1 alpha, just today we ran into an issue where the very build system we are using spat out an oh so informative “Prelude.foldr1: Empty list” when using a pkgconfig-depends stanza that didnt include any explicit bounds.
David Feuer is worried about performance of recursive functions [6]
As I recall, the main things to watch out for, performance-wise, are recursive definitions. When we throw an error from a library function, we *typically* mean that the caller made a mistake. We don't want to build up the call stacks we'd need to debug the library function itself, unless we're actually doing so (in which case we can edit it in, of course). In current base implementation all recursive functions (like foldr1, or !!) have internal workers, so the callstack is not building-up.
Eric Seidel comments later [8]
What I remember finding back then was that there was a small overhead for non-recursive functions like `head` but a substantial overhead for recursive functions. I'd suggest extra care around recursive functions ((!!) comes to mind). Perhaps rewrite them to use an inner recursive loop that does not extend the CallStack (this might produce nicer stacktraces anyway). That is how (!!) is currently written in base. It has an inner worker. (His benchmark link is not valid anymore, so I cannot tell what !! variant he benchmarked).
---
Matthew Pickering comments [7] about -xc RTS flag.
I find this thread a bit concerning. In my opinion the current best way to get call stacks on exceptions is with `-xc`. Adding runtime overhead to every user program is not acceptable. -xc requires recompiling the program for profiling.
He continues with
There is an argument that it would be good to disentangle `-xc` from `prof` but you would still have to compile `base` in this way which instruments these partial functions (as a user can not do it herself). I'm not too sure on the details but I don't think -xc uses any information from the profiling header so the fact it's connected with -prof seems more like convenience than necessity. If that work is done, we can drop HasCallStack from partial functions, until then again let not perfect be the enemy of good.
For example, me seeing GHCJS throwing on !!, of Edward cabal-install on foldr1 doesn't help. Rebuilding cabal-install with profiling is viable (but not for an average person who downloads it with ghcup), rebuilding GHCJS for profiling is a skill few people have.
Already in his original proposal Luo Chen says:
When we run a long running program, such as a web service, it is not easy to reproduce the issue, most of the time, you have no chance to recompile or restart your program to debug, all you can rely on is the printed logs, this makes -xc not as useful as HasCallStack.
People are worried about performance. GHC itself uses some of the a affected functions. There are 30 foldr1, some head and tail calls, and also !! in `compiler/`
The performance metrics in MR do not regress. GHC is not slowed down.
I also run `nofib` using `--cachegrind -s Norm -j 16`, geometric means:
- allocations: -0.12% - instructions: +0.05% - LLC cache misses: +0.58% - L1 cache misses: +0.03%
And also using `--perf` (without `-j`):
- perf instructions: +0.02% - perf cycles: -0.80%
I don't know if this in bounds of "small changes to GHC". For me this looks acceptable.
---
There is also off-thread blog post from 2018. https://neilmitchell.blogspot.com/2018/03/safe-library-with-better-stack-tra... referencing e.g. https://hackage.haskell.org/package/extra-1.7.9/docs/Data-List-Extra.html#v:... and https://hackage.haskell.org/package/safe
safe library has plenty of reverse dependencies: https://packdeps.haskellers.com/reverse/safe, and extra is used by shake.
---
In summary:
- fromJust has HasCallStack, head doesn't. Let us fix this. - Ben asked for patch so we can test performance, now such patch exists, and it passes GHC CI. - GHC itself uses partial functions, its performance metrics don't regress - -prof and +RTS -xc is an option, but it needs special build of an executable. - This is ultimately for CLC to decide, so chessai, emilypi please tell your opinion.
Discussion period one month, until 2021-06-30 (end of June this year).
Oleg
[1]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_231634 [2]: https://mail.haskell.org/pipermail/libraries/2019-November/030059.html https://gitlab.haskell.org/ghc/ghc/-/issues/13573 [3]: https://gitlab.haskell.org/ghc/ghc/-/issues/17040#note_218035 [4]: https://gitlab.haskell.org/ghc/ghc/-/issues/15559 [5]: https://mail.haskell.org/pipermail/libraries/2019-June/029665.html [6]: https://mail.haskell.org/pipermail/libraries/2019-June/029666.html [7]: https://mail.haskell.org/pipermail/libraries/2019-June/029672.html [8]: https://mail.haskell.org/pipermail/libraries/2019-June/029667.html
---
# bytes allocated
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 2.823e9 | 0.00% | | imaginary/digits-of-e1 || | 1.069e9 | 0.00% | | imaginary/digits-of-e2 || | 2.152e9 | 0.00% | | imaginary/exp3_8 || | 5.888e9 | 0.00% | | imaginary/gen_regexps || | 9.104e8 | 0.00% | | imaginary/integrate || | 3.768e9 | 0.00% | | imaginary/kahan || | 49088.000 | 0.00% | | imaginary/paraffins || | 3.829e9 | 0.00% | | imaginary/primes || | 2.928e9 | 0.00% | | imaginary/queens || | 6.709e8 | 0.00% | | imaginary/rfib || | 139952.000 | 0.00% | | imaginary/tak || | 97344.000 | 0.00% | | imaginary/wheel-sieve1 || | 1.344e8 | 0.00% | | imaginary/wheel-sieve2 || | 2.430e9 | 0.00% | | imaginary/x2n1 || | 2.561e8 | 0.00% | | parallel/blackscholes || | 1.980e9 | 0.00% | | parallel/coins || | 5.252e9 | 0.00% | | parallel/gray || | 2.010e9 | +0.00% | | parallel/mandel || | 8.524e9 | 0.00% | | parallel/matmult || | 8.974e7 | 0.00% | | parallel/minimax || | 2.212e10 | 0.00% | | parallel/nbody || | 1498304.000 | 0.00% | | parallel/parfib || | 3.651e8 | 0.00% | | parallel/partree || | 3.290e9 | 0.00% | | parallel/prsa || | 2.097e9 | 0.00% | | parallel/queens || | 6.846e8 | 0.00% | | parallel/ray || | 1.357e10 | 0.00% | | parallel/sumeuler || | 1785016.000 | 0.00% | | parallel/transclos || | 8.976e9 | 0.00% | | real/anna || | 2.022e9 | +0.01% | | real/ben-raytrace || | 3.418e10 | 0.00% | | real/bspt || | 3.747e9 | 0.00% | | real/cacheprof || | 2.689e9 | 0.00% | | real/compress || | 2.807e9 | 0.00% | | real/compress2 || | 3.436e9 | 0.00% | | real/eff/CS || | 1.601e8 | 0.00% | | real/eff/CSD || | 1.600e9 | 0.00% | | real/eff/FS || | 1.760e9 | 0.00% | | real/eff/S || | 2.401e8 | 0.00% | | real/eff/VS || | 4.831e8 | 0.00% | | real/eff/VSD || | 50736.000 | 0.00% | | real/eff/VSM || | 4.001e8 | 0.00% | | real/fem || | 4.947e9 | -2.81% | | real/fluid || | 2.169e9 | -0.00% | | real/fulsom || | 1.961e9 | 0.00% | | real/gamteb || | 4.447e9 | 0.00% | | real/gg || | 2.654e9 | 0.00% | | real/grep || | 4.623e9 | 0.00% | | real/hidden || | 5.100e9 | 0.00% | | real/hpg || | 3.160e9 | -0.10% | | real/infer || | 1.731e9 | 0.00% | | real/lift || | 2.761e9 | 0.00% | | real/linear || | 5.412e9 | -0.07% | | real/maillist || | 3.331e9 | 0.00% | | real/mkhprog || | 9748392.000 | 0.00% | | real/parser || | 2.666e9 | 0.00% | | real/pic || | 1.469e9 | 0.00% | | real/prolog || | 2.922e9 | -0.02% | | real/reptile || | 5.121e9 | 0.00% | | real/rsa || | 8.414e8 | 0.00% | | real/scs || | 4.044e9 | 0.00% | | real/smallpt || | 2.874e9 | 0.00% | | real/symalg || | 3.195e8 | 0.00% | | real/veritas || | 4.172e9 | 0.00% | | shootout/binary-trees || | 4.300e9 | 0.00% | | shootout/fannkuch-redux || | 69144.000 | -0.03% | | shootout/fasta || | 1.718e9 | +0.00% | | shootout/k-nucleotide || | 7.081e7 | +0.00% | | shootout/n-body || | 130608.000 | 0.00% | | shootout/pidigits || | 1.027e10 | 0.00% | | shootout/reverse-complement || | 59768.000 | 0.00% | | shootout/spectral-norm || | 178112.000 | 0.00% | | smp/callback001 || | 1.114e9 | 0.00% | | smp/callback002 || | 3.264e9 | 0.00% | | smp/chan || | 1.240e9 | 0.00% | | smp/sieve || | 1.410e9 | 0.00% | | smp/threads001 || | 1.072e10 | 0.00% | | smp/threads003 || | 3.051e8 | -0.01% | | smp/threads006 || | 2.242e8 | 0.00% | | smp/threads007 || | 1.778e9 | -0.00% | | spectral/ansi || | 6.713e9 | 0.00% | | spectral/atom || | 3.580e9 | 0.00% | | spectral/awards || | 4.759e9 | 0.00% | | spectral/banner || | 6.156e9 | 0.00% | | spectral/boyer || | 4.665e9 | 0.00% | | spectral/boyer2 || | 1.153e9 | 0.00% | | spectral/calendar || | 7.102e9 | 0.00% | | spectral/cichelli || | 1.969e9 | 0.00% | | spectral/circsim || | 4.850e9 | 0.00% | | spectral/clausify || | 2.095e9 | 0.00% | | spectral/constraints || | 4.872e9 | 0.00% | | spectral/cryptarithm1 || | 5.981e9 | 0.00% | | spectral/cryptarithm2 || | 3.663e9 | 0.00% | | spectral/cse || | 3.802e9 | 0.00% | | spectral/dom-lt || | 3.890e9 | 0.00% | | spectral/eliza || | 4.102e9 | +0.00% | | spectral/exact-reals || | 9.584e8 | -0.00% | | spectral/expert || | 2.090e9 | 0.00% | | spectral/fft2 || | 1.431e9 | -0.22% | | spectral/fibheaps || | 4.737e9 | 0.00% | | spectral/fish || | 6.193e9 | 0.00% | | spectral/gcd || | 2.069e9 | 0.00% | | spectral/hartel/comp_lab_zift || | 4.740e9 | 0.00% | | spectral/hartel/event || | 3.635e9 | -12.13% | | spectral/hartel/fft || | 1.611e9 | 0.00% | | spectral/hartel/genfft || | 8.020e9 | 0.00% | | spectral/hartel/ida || | 3.515e9 | 0.00% | | spectral/hartel/listcompr || | 6.157e9 | 0.00% | | spectral/hartel/listcopy || | 6.758e9 | 0.00% | | spectral/hartel/nucleic2 || | 2.965e9 | 0.00% | | spectral/hartel/parstof || | 1.368e9 | 0.00% | | spectral/hartel/sched || | 3.675e9 | 0.00% | | spectral/hartel/solid || | 3.509e9 | 0.00% | | spectral/hartel/transform || | 3.959e9 | 0.00% | | spectral/hartel/typecheck || | 2.570e9 | 0.00% | | spectral/hartel/wang || | 4.735e9 | 0.00% | | spectral/hartel/wave4main || | 1.147e9 | 0.00% | | spectral/integer || | 3.260e9 | 0.00% | | spectral/knights || | 1.094e9 | 0.00% | | spectral/lambda || | 2.950e9 | 0.00% | | spectral/last-piece || | 6.852e8 | 0.00% | | spectral/lcss || | 6.565e9 | 0.00% | | spectral/life || | 6.799e9 | 0.00% | | spectral/mandel || | 1.972e9 | 0.00% | | spectral/mandel2 || | 5.231e8 | 0.00% | | spectral/mate || | 4.598e9 | 0.00% | | spectral/minimax || | 2.683e9 | 0.00% | | spectral/multiplier || | 2.850e9 | 0.00% | | spectral/para || | 4.056e9 | 0.00% | | spectral/power || | 1.428e9 | 0.00% | | spectral/pretty || | 136880.000 | -0.11% | | spectral/primetest || | 8.455e8 | 0.00% | | spectral/puzzle || | 1.809e9 | 0.00% | | spectral/rewrite || | 1.694e9 | 0.00% | | spectral/scc || | 58280.000 | 0.00% | | spectral/simple || | 2.316e9 | 0.00% | | spectral/sorting || | 3.078e9 | 0.00% | | spectral/sphere || | 2.298e9 | 0.00% | | spectral/treejoin || | 2.796e9 | 0.00% | +===============================++==+=============+==================+ | geom mean || | -0.12% | | +-------------------------------++--+-------------+------------------+
# instructions
+-------------------------------++--+------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+============+==================+ | imaginary/bernouilli || | 7.057e9 | +0.00% | | imaginary/digits-of-e1 || | 5.549e9 | -0.00% | | imaginary/digits-of-e2 || | 5.555e9 | -0.01% | | imaginary/exp3_8 || | 8.779e9 | +0.03% | | imaginary/gen_regexps || | 8.650e9 | -0.00% | | imaginary/integrate || | 6.276e9 | +0.00% | | imaginary/kahan || | 6.707e9 | +0.00% | | imaginary/paraffins || | 8.089e9 | -0.00% | | imaginary/primes || | 8.278e9 | +0.01% | | imaginary/queens || | 1.010e10 | -0.00% | | imaginary/rfib || | 5.299e9 | +0.00% | | imaginary/tak || | 5.867e9 | +0.00% | | imaginary/wheel-sieve1 || | 6.615e9 | +0.04% | | imaginary/wheel-sieve2 || | 6.286e9 | +0.02% | | imaginary/x2n1 || | 7.452e9 | +0.00% | | parallel/blackscholes || | 8.022e9 | +0.00% | | parallel/coins || | 1.149e10 | +0.00% | | parallel/gray || | 6.141e9 | +0.14% | | parallel/mandel || | 3.288e10 | -0.01% | | parallel/matmult || | 1.115e10 | -0.00% | | parallel/minimax || | 3.863e10 | -0.08% | | parallel/nbody || | 7.939e8 | +0.00% | | parallel/parfib || | 2.231e10 | +0.00% | | parallel/partree || | 7.347e9 | +0.01% | | parallel/prsa || | 1.811e10 | -0.00% | | parallel/queens || | 1.037e10 | +0.00% | | parallel/ray || | 1.299e10 | +0.00% | | parallel/sumeuler || | 3.483e9 | +0.00% | | parallel/transclos || | 1.982e10 | +0.00% | | real/anna || | 5.343e9 | +0.05% | | real/ben-raytrace || | 1.215e11 | +0.00% | | real/bspt || | 9.226e9 | -0.00% | | real/cacheprof || | 6.763e9 | +0.02% | | real/compress || | 5.820e9 | -0.00% | | real/compress2 || | 4.569e9 | +0.00% | | real/eff/CS || | 7.758e8 | +0.00% | | real/eff/CSD || | 3.745e9 | +0.00% | | real/eff/FS || | 2.799e9 | +0.00% | | real/eff/S || | 4.334e9 | +0.00% | | real/eff/VS || | 2.221e9 | +0.01% | | real/eff/VSD || | 8.075e7 | +0.00% | | real/eff/VSM || | 9.635e8 | +0.00% | | real/fem || | 6.649e9 | -0.64% | | real/fluid || | 3.904e9 | -0.00% | | real/fulsom || | 2.490e9 | +0.00% | | real/gamteb || | 1.013e10 | +0.01% | | real/gg || | 7.253e9 | +0.01% | | real/grep || | 7.546e9 | +0.00% | | real/hidden || | 7.198e9 | +1.64% | | real/hpg || | 4.966e9 | +0.88% | | real/infer || | 8.318e9 | +0.00% | | real/lift || | 4.430e9 | -0.00% | | real/linear || | 8.436e9 | +1.97% | | real/maillist || | 1.974e9 | +0.05% | | real/mkhprog || | 2.249e7 | +0.00% | | real/parser || | 5.178e9 | -0.00% | | real/pic || | 3.268e9 | -0.00% | | real/prolog || | 5.742e9 | +0.01% | | real/reptile || | 6.046e9 | +0.00% | | real/rsa || | 7.191e9 | +0.00% | | real/scs || | 6.174e9 | +0.00% | | real/smallpt || | 1.128e10 | +0.00% | | real/symalg || | 8.230e9 | +0.00% | | real/veritas || | 4.832e9 | -0.01% | | shootout/binary-trees || | 1.073e10 | +0.01% | | shootout/fannkuch-redux || | 1.909e10 | -0.00% | | shootout/fasta || | 4.189e9 | +0.00% | | shootout/k-nucleotide || | 4.219e9 | +0.01% | | shootout/n-body || | 3.721e9 | +0.00% | | shootout/pidigits || | 8.084e9 | +0.00% | | shootout/reverse-complement || | 781364.000 | +0.51% | | shootout/spectral-norm || | 4.252e9 | +0.00% | | smp/callback001 || | 1.573e9 | +0.01% | | smp/callback002 || | 2.621e9 | +0.00% | | smp/chan || | 8.718e9 | +2.56% | | smp/sieve || | 5.538e9 | -0.87% | | smp/threads001 || | 5.139e9 | -0.00% | | smp/threads003 || | 2.903e9 | -0.05% | | smp/threads006 || | 7.402e8 | +0.01% | | smp/threads007 || | 4.090e9 | -0.00% | | spectral/ansi || | 5.961e9 | -0.00% | | spectral/atom || | 5.861e9 | +0.01% | | spectral/awards || | 8.744e9 | +0.00% | | spectral/banner || | 8.824e9 | +0.23% | | spectral/boyer || | 7.657e9 | -0.00% | | spectral/boyer2 || | 8.881e9 | -0.00% | | spectral/calendar || | 7.546e9 | -0.00% | | spectral/cichelli || | 8.625e9 | +0.01% | | spectral/circsim || | 6.850e9 | +0.00% | | spectral/clausify || | 6.223e9 | -0.00% | | spectral/constraints || | 8.314e9 | +0.14% | | spectral/cryptarithm1 || | 7.787e9 | -0.00% | | spectral/cryptarithm2 || | 6.761e9 | +0.00% | | spectral/cse || | 6.358e9 | -0.00% | | spectral/dom-lt || | 7.774e9 | -0.00% | | spectral/eliza || | 8.273e9 | +0.00% | | spectral/exact-reals || | 5.597e9 | +0.01% | | spectral/expert || | 5.087e9 | +0.04% | | spectral/fft2 || | 8.831e9 | +0.31% | | spectral/fibheaps || | 8.011e9 | -0.00% | | spectral/fish || | 7.314e9 | -0.00% | | spectral/gcd || | 6.386e9 | -0.00% | | spectral/hartel/comp_lab_zift || | 8.717e9 | -0.00% | | spectral/hartel/event || | 9.071e9 | -2.06% | | spectral/hartel/fft || | 3.239e9 | +0.00% | | spectral/hartel/genfft || | 1.020e10 | +0.00% | | spectral/hartel/ida || | 5.413e9 | -0.30% | | spectral/hartel/listcompr || | 6.142e9 | +0.02% | | spectral/hartel/listcopy || | 6.757e9 | +0.02% | | spectral/hartel/nucleic2 || | 4.402e9 | +0.00% | | spectral/hartel/parstof || | 5.555e9 | -0.00% | | spectral/hartel/sched || | 5.800e9 | +0.00% | | spectral/hartel/solid || | 5.845e9 | +0.24% | | spectral/hartel/transform || | 5.709e9 | -0.00% | | spectral/hartel/typecheck || | 5.841e9 | +0.00% | | spectral/hartel/wang || | 8.731e9 | +0.12% | | spectral/hartel/wave4main || | 6.024e9 | -0.00% | | spectral/integer || | 7.068e9 | -0.00% | | spectral/knights || | 8.294e9 | -0.00% | | spectral/lambda || | 8.081e9 | +0.00% | | spectral/last-piece || | 1.878e9 | +0.00% | | spectral/lcss || | 8.761e9 | -0.00% | | spectral/life || | 9.136e9 | -0.00% | | spectral/mandel || | 7.037e9 | +0.00% | | spectral/mandel2 || | 3.957e9 | +0.00% | | spectral/mate || | 7.565e9 | +0.01% | | spectral/minimax || | 8.649e9 | -0.00% | | spectral/multiplier || | 6.096e9 | +0.00% | | spectral/para || | 6.561e9 | +0.00% | | spectral/power || | 6.749e9 | -0.00% | | spectral/pretty || | 851224.000 | +0.17% | | spectral/primetest || | 7.391e9 | -0.00% | | spectral/puzzle || | 6.401e9 | +0.00% | | spectral/rewrite || | 5.553e9 | +0.67% | | spectral/scc || | 774059.000 | +0.49% | | spectral/simple || | 1.214e10 | +0.01% | | spectral/sorting || | 9.074e9 | -0.00% | | spectral/sphere || | 5.371e9 | -0.00% | | spectral/treejoin || | 9.768e9 | +0.00% | +===============================++==+============+==================+ | geom mean || | +0.05% | | +-------------------------------++--+------------+------------------+
# LLC cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4964.000 | +1.37% | | imaginary/digits-of-e1 || | 4863.000 | -0.35% | | imaginary/digits-of-e2 || | 4958.000 | +1.63% | | imaginary/exp3_8 || | 4513.000 | +0.42% | | imaginary/gen_regexps || | 4535.000 | +0.09% | | imaginary/integrate || | 4733.000 | +1.08% | | imaginary/kahan || | 4447.000 | -0.13% | | imaginary/paraffins || | 4826.000 | -0.08% | | imaginary/primes || | 4876.000 | +0.94% | | imaginary/queens || | 4541.000 | -0.07% | | imaginary/rfib || | 4485.000 | -0.13% | | imaginary/tak || | 4461.000 | +0.25% | | imaginary/wheel-sieve1 || | 4865.000 | +1.29% | | imaginary/wheel-sieve2 || | 4893.000 | +1.25% | | imaginary/x2n1 || | 4630.000 | +0.22% | | parallel/blackscholes || | 12862.000 | +0.30% | | parallel/coins || | 6455583.000 | +0.00% | | parallel/gray || | 6372.000 | +1.77% | | parallel/mandel || | 852468.000 | -0.02% | | parallel/matmult || | 4615.000 | -0.30% | | parallel/minimax || | 4617.000 | +0.84% | | parallel/nbody || | 4455.000 | -0.04% | | parallel/parfib || | 4528.000 | +0.22% | | parallel/partree || | 4627.000 | +0.43% | | parallel/prsa || | 4619.000 | +0.54% | | parallel/queens || | 4528.000 | +1.37% | | parallel/ray || | 4626.000 | +0.35% | | parallel/sumeuler || | 4446.000 | +0.13% | | parallel/transclos || | 4741.000 | -0.17% | | real/anna || | 6443.000 | +5.34% | | real/ben-raytrace || | 6819.000 | -0.13% | | real/bspt || | 5195.000 | -0.21% | | real/cacheprof || | 6734.000 | +1.62% | | real/compress || | 4914.000 | +0.53% | | real/compress2 || | 4783.000 | -0.25% | | real/eff/CS || | 4439.000 | +0.38% | | real/eff/CSD || | 4446.000 | 0.00% | | real/eff/FS || | 4451.000 | -0.04% | | real/eff/S || | 5619842.000 | -0.00% | | real/eff/VS || | 1254362.000 | +0.00% | | real/eff/VSD || | 4403.000 | -0.43% | | real/eff/VSM || | 4445.000 | -0.11% | | real/fem || | 4967.000 | +2.07% | | real/fluid || | 6117.000 | +0.85% | | real/fulsom || | 5060.000 | -0.10% | | real/gamteb || | 5615.000 | +0.64% | | real/gg || | 5242.000 | +0.88% | | real/grep || | 4866.000 | +0.62% | | real/hidden || | 5576.000 | +2.06% | | real/hpg || | 5614.000 | +2.92% | | real/infer || | 4833.000 | -0.14% | | real/lift || | 4809.000 | +1.48% | | real/linear || | 5368.000 | +4.53% | | real/maillist || | 12942.000 | +0.32% | | real/mkhprog || | 4483.000 | +0.20% | | real/parser || | 5309.000 | +1.64% | | real/pic || | 4937.000 | +0.81% | | real/prolog || | 4843.000 | +1.03% | | real/reptile || | 5548.000 | -0.43% | | real/rsa || | 4667.000 | +0.26% | | real/scs || | 5667.000 | +1.48% | | real/smallpt || | 5836.000 | +1.29% | | real/symalg || | 5422.000 | +0.30% | | real/veritas || | 6984.000 | +2.61% | | shootout/binary-trees || | 5079.000 | +0.73% | | shootout/fannkuch-redux || | 4478.000 | -0.51% | | shootout/fasta || | 4625.000 | -0.13% | | shootout/k-nucleotide || | 1161663.000 | -2.58% | | shootout/n-body || | 4512.000 | +0.04% | | shootout/pidigits || | 4651.000 | -0.39% | | shootout/reverse-complement || | 4416.000 | 0.00% | | shootout/spectral-norm || | 4477.000 | +0.25% | | smp/callback001 || | 488453.000 | -0.01% | | smp/callback002 || | 4513.000 | -0.11% | | smp/chan || | 1.110e7 | +7.03% | | smp/sieve || | 4555.000 | +0.72% | | smp/threads001 || | 4481.000 | +0.49% | | smp/threads003 || | 83898.000 | -1.63% | | smp/threads006 || | 1804659.000 | +0.49% | | smp/threads007 || | 2427701.000 | -0.24% | | spectral/ansi || | 4759.000 | +0.27% | | spectral/atom || | 4691.000 | +0.62% | | spectral/awards || | 4717.000 | +1.14% | | spectral/banner || | 5056.000 | +1.21% | | spectral/boyer || | 5045.000 | +0.06% | | spectral/boyer2 || | 4832.000 | -0.04% | | spectral/calendar || | 4622.000 | +0.74% | | spectral/cichelli || | 4728.000 | +1.67% | | spectral/circsim || | 40269.000 | -1.55% | | spectral/clausify || | 4835.000 | -0.17% | | spectral/constraints || | 4871.000 | +1.44% | | spectral/cryptarithm1 || | 4562.000 | +0.18% | | spectral/cryptarithm2 || | 4600.000 | +0.07% | | spectral/cse || | 4534.000 | +0.33% | | spectral/dom-lt || | 5179.000 | +0.10% | | spectral/eliza || | 4968.000 | +0.34% | | spectral/exact-reals || | 4840.000 | +1.34% | | spectral/expert || | 4770.000 | +2.81% | | spectral/fft2 || | 5296.000 | +1.91% | | spectral/fibheaps || | 4858.000 | +0.02% | | spectral/fish || | 4687.000 | +0.04% | | spectral/gcd || | 4575.000 | +0.22% | | spectral/hartel/comp_lab_zift || | 4960.000 | +0.58% | | spectral/hartel/event || | 4875.000 | +0.96% | | spectral/hartel/fft || | 5121.000 | +0.70% | | spectral/hartel/genfft || | 4875.000 | +0.04% | | spectral/hartel/ida || | 4877.000 | +0.84% | | spectral/hartel/listcompr || | 4651.000 | +1.76% | | spectral/hartel/listcopy || | 4649.000 | +1.96% | | spectral/hartel/nucleic2 || | 5998.000 | +0.68% | | spectral/hartel/parstof || | 5583.000 | -0.05% | | spectral/hartel/sched || | 4856.000 | -0.23% | | spectral/hartel/solid || | 5282.000 | +1.21% | | spectral/hartel/transform || | 4875.000 | +1.56% | | spectral/hartel/typecheck || | 4724.000 | +0.95% | | spectral/hartel/wang || | 4993.000 | +2.38% | | spectral/hartel/wave4main || | 4877.000 | -0.04% | | spectral/integer || | 4619.000 | -0.13% | | spectral/knights || | 4694.000 | +0.58% | | spectral/lambda || | 4984.000 | +0.66% | | spectral/last-piece || | 4869.000 | -0.21% | | spectral/lcss || | 4876.000 | +0.04% | | spectral/life || | 4884.000 | +1.29% | | spectral/mandel || | 4900.000 | +0.16% | | spectral/mandel2 || | 4479.000 | -0.13% | | spectral/mate || | 5086.000 | +1.83% | | spectral/minimax || | 4605.000 | -0.04% | | spectral/multiplier || | 4672.000 | +0.98% | | spectral/para || | 4935.000 | +0.83% | | spectral/power || | 4918.000 | +0.18% | | spectral/pretty || | 4432.000 | +0.14% | | spectral/primetest || | 5021.000 | -0.04% | | spectral/puzzle || | 4603.000 | +0.04% | | spectral/rewrite || | 4618.000 | +0.97% | | spectral/scc || | 4415.000 | +0.34% | | spectral/simple || | 2413361.000 | -1.18% | | spectral/sorting || | 5357.000 | -1.55% | | spectral/sphere || | 5717.000 | +0.84% | | spectral/treejoin || | 5130.000 | +0.02% | +===============================++==+=============+==================+ | geom mean || | +0.58% | | +-------------------------------++--+-------------+------------------+
# L1 cache misses
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 4.235e7 | +0.13% | | imaginary/digits-of-e1 || | 3708507.000 | -0.06% | | imaginary/digits-of-e2 || | 2.913e7 | -0.16% | | imaginary/exp3_8 || | 1.881e8 | -0.07% | | imaginary/gen_regexps || | 2.915e7 | -0.05% | | imaginary/integrate || | 1341520.000 | -4.99% | | imaginary/kahan || | 7577.000 | +0.15% | | imaginary/paraffins || | 5.994e7 | -0.02% | | imaginary/primes || | 1.165e8 | -0.01% | | imaginary/queens || | 315321.000 | -0.94% | | imaginary/rfib || | 7833.000 | -0.46% | | imaginary/tak || | 7688.000 | +0.03% | | imaginary/wheel-sieve1 || | 7508229.000 | +0.51% | | imaginary/wheel-sieve2 || | 4.338e7 | -0.02% | | imaginary/x2n1 || | 129793.000 | +0.50% | | parallel/blackscholes || | 1.550e7 | -0.16% | | parallel/coins || | 3.952e7 | +0.26% | | parallel/gray || | 1.736e7 | +1.38% | | parallel/mandel || | 1.356e7 | +0.20% | | parallel/matmult || | 5.267e8 | -0.01% | | parallel/minimax || | 1.140e8 | -0.14% | | parallel/nbody || | 1.248e7 | -0.02% | | parallel/parfib || | 252463.000 | +6.49% | | parallel/partree || | 5.642e7 | +0.08% | | parallel/prsa || | 5700667.000 | +0.27% | | parallel/queens || | 3129546.000 | +0.19% | | parallel/ray || | 1.260e7 | +4.27% | | parallel/sumeuler || | 35221.000 | -0.07% | | parallel/transclos || | 1.863e7 | +0.17% | | real/anna || | 3.737e7 | +0.10% | | real/ben-raytrace || | 6.695e7 | +0.59% | | real/bspt || | 1.492e8 | +0.01% | | real/cacheprof || | 5.661e7 | -0.24% | | real/compress || | 3.247e7 | -2.71% | | real/compress2 || | 2.717e7 | +0.13% | | real/eff/CS || | 54141.000 | -0.28% | | real/eff/CSD || | 532877.000 | -0.07% | | real/eff/FS || | 512883.000 | +0.18% | | real/eff/S || | 1.412e7 | -0.07% | | real/eff/VS || | 6730192.000 | -0.42% | | real/eff/VSD || | 7449.000 | -0.30% | | real/eff/VSM || | 121912.000 | -0.22% | | real/fem || | 3.841e7 | +6.86% | | real/fluid || | 1.579e7 | +0.91% | | real/fulsom || | 1.036e7 | +0.03% | | real/gamteb || | 3.473e7 | -0.02% | | real/gg || | 7.439e7 | +0.09% | | real/grep || | 7.940e7 | +0.08% | | real/hidden || | 1.074e7 | +0.20% | | real/hpg || | 1.757e7 | +0.32% | | real/infer || | 2.006e8 | -0.02% | | real/lift || | 2.741e7 | +0.20% | | real/linear || | 8.899e7 | +1.27% | | real/maillist || | 9646364.000 | -0.06% | | real/mkhprog || | 11950.000 | +3.72% | | real/parser || | 1.269e7 | +0.92% | | real/pic || | 4.450e7 | -0.24% | | real/prolog || | 2.973e7 | -0.34% | | real/reptile || | 1.945e7 | -0.07% | | real/rsa || | 1310283.000 | -0.18% | | real/scs || | 1.916e7 | +0.06% | | real/smallpt || | 7088127.000 | +0.47% | | real/symalg || | 5981494.000 | -0.11% | | real/veritas || | 1.860e7 | -1.22% | | shootout/binary-trees || | 3.661e7 | +0.01% | | shootout/fannkuch-redux || | 7741.000 | -0.62% | | shootout/fasta || | 5.215e7 | +0.01% | | shootout/k-nucleotide || | 1.247e7 | +0.01% | | shootout/n-body || | 8025.000 | +0.04% | | shootout/pidigits || | 2.316e8 | +0.02% | | shootout/reverse-complement || | 7627.000 | -0.20% | | shootout/spectral-norm || | 21764.000 | +0.23% | | smp/callback001 || | 5824201.000 | +0.07% | | smp/callback002 || | 8288204.000 | -0.09% | | smp/chan || | 2.846e7 | +2.62% | | smp/sieve || | 5.400e7 | -1.10% | | smp/threads001 || | 2.312e7 | +0.45% | | smp/threads003 || | 4.773e7 | -0.22% | | smp/threads006 || | 9331792.000 | +0.02% | | smp/threads007 || | 2.721e7 | +0.36% | | spectral/ansi || | 6.940e7 | -0.01% | | spectral/atom || | 1.248e8 | +0.01% | | spectral/awards || | 7810137.000 | -1.82% | | spectral/banner || | 3.727e7 | +2.57% | | spectral/boyer || | 2.284e7 | -0.19% | | spectral/boyer2 || | 3.926e7 | -0.63% | | spectral/calendar || | 7366268.000 | -0.91% | | spectral/cichelli || | 1.797e7 | +0.02% | | spectral/circsim || | 9.138e7 | +0.07% | | spectral/clausify || | 6134801.000 | -0.11% | | spectral/constraints || | 2.950e7 | +0.38% | | spectral/cryptarithm1 || | 3139494.000 | +0.08% | | spectral/cryptarithm2 || | 3481535.000 | +0.35% | | spectral/cse || | 4798864.000 | -7.01% | | spectral/dom-lt || | 2.556e7 | -0.11% | | spectral/eliza || | 1.921e7 | +1.14% | | spectral/exact-reals || | 2391927.000 | +1.24% | | spectral/expert || | 2.311e7 | -0.08% | | spectral/fft2 || | 1.917e8 | +0.81% | | spectral/fibheaps || | 5.236e7 | -0.06% | | spectral/fish || | 8017906.000 | +0.13% | | spectral/gcd || | 1652038.000 | +0.07% | | spectral/hartel/comp_lab_zift || | 6.167e7 | -0.11% | | spectral/hartel/event || | 4.857e7 | -2.47% | | spectral/hartel/fft || | 3.723e7 | -0.04% | | spectral/hartel/genfft || | 2.201e7 | +1.31% | | spectral/hartel/ida || | 1.316e7 | +0.16% | | spectral/hartel/listcompr || | 9143834.000 | +1.54% | | spectral/hartel/listcopy || | 1.018e7 | +2.27% | | spectral/hartel/nucleic2 || | 1.035e7 | -2.83% | | spectral/hartel/parstof || | 2.290e7 | -2.36% | | spectral/hartel/sched || | 6090930.000 | -0.15% | | spectral/hartel/solid || | 3.408e7 | +0.00% | | spectral/hartel/transform || | 2.255e7 | +0.25% | | spectral/hartel/typecheck || | 1.447e7 | -1.37% | | spectral/hartel/wang || | 1.089e8 | +0.19% | | spectral/hartel/wave4main || | 8.229e7 | +0.29% | | spectral/integer || | 1101168.000 | -0.06% | | spectral/knights || | 3.424e7 | +0.92% | | spectral/lambda || | 6.667e7 | +0.14% | | spectral/last-piece || | 3620219.000 | -0.43% | | spectral/lcss || | 7.252e7 | -0.26% | | spectral/life || | 1.231e8 | -0.11% | | spectral/mandel || | 741678.000 | +0.09% | | spectral/mandel2 || | 311375.000 | +0.79% | | spectral/mate || | 4858523.000 | -1.23% | | spectral/minimax || | 1172869.000 | +0.51% | | spectral/multiplier || | 1.060e8 | +0.03% | | spectral/para || | 5.089e7 | +0.15% | | spectral/power || | 4.488e7 | -0.00% | | spectral/pretty || | 7649.000 | +0.38% | | spectral/primetest || | 500918.000 | +1.32% | | spectral/puzzle || | 3210919.000 | -0.09% | | spectral/rewrite || | 825290.000 | -7.73% | | spectral/scc || | 7483.000 | +0.16% | | spectral/simple || | 8.786e7 | +0.01% | | spectral/sorting || | 1.261e8 | -0.02% | | spectral/sphere || | 4854033.000 | +0.43% | | spectral/treejoin || | 8.455e7 | +0.03% | +===============================++==+=============+==================+ | geom mean || | +0.03% | | +-------------------------------++--+-------------+------------------+
# perf instructions
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 7.085e9 | -0.22% | | imaginary/digits-of-e1 || | 5.547e9 | -0.03% | | imaginary/digits-of-e2 || | 5.549e9 | -0.06% | | imaginary/exp3_8 || | 8.785e9 | -0.06% | | imaginary/gen_regexps || | 8.650e9 | -0.04% | | imaginary/integrate || | 6.260e9 | +0.20% | | imaginary/kahan || | 6.699e9 | +0.16% | | imaginary/paraffins || | 8.112e9 | -0.24% | | imaginary/primes || | 8.244e9 | -0.24% | | imaginary/queens || | 1.009e10 | +0.04% | | imaginary/rfib || | 5.298e9 | +0.14% | | imaginary/tak || | 5.861e9 | +0.10% | | imaginary/wheel-sieve1 || | 6.662e9 | -0.76% | | imaginary/wheel-sieve2 || | 6.278e9 | +0.38% | | imaginary/x2n1 || | 7.453e9 | -0.12% | | parallel/blackscholes || | 8.096e9 | -0.18% | | parallel/coins || | 1.194e10 | -0.03% | | parallel/gray || | 6.154e9 | -0.07% | | parallel/mandel || | 3.293e10 | +0.12% | | parallel/matmult || | 1.118e10 | +0.06% | | parallel/minimax || | 3.867e10 | -0.11% | | parallel/nbody || | 7.934e8 | +0.05% | | parallel/parfib || | 2.232e10 | -0.01% | | parallel/partree || | 7.358e9 | +0.02% | | parallel/prsa || | 1.808e10 | +0.14% | | parallel/queens || | 1.037e10 | -0.03% | | parallel/ray || | 1.301e10 | +0.01% | | parallel/sumeuler || | 3.487e9 | -0.01% | | parallel/transclos || | 1.983e10 | -0.02% | | real/anna || | 5.334e9 | +0.27% | | real/ben-raytrace || | 1.216e11 | -0.02% | | real/bspt || | 9.224e9 | -0.05% | | real/cacheprof || | 6.735e9 | -0.46% | | real/compress || | 5.810e9 | +0.07% | | real/compress2 || | 4.580e9 | -0.21% | | real/eff/CS || | 7.582e8 | +1.19% | | real/eff/CSD || | 3.758e9 | -0.56% | | real/eff/FS || | 2.792e9 | +0.02% | | real/eff/S || | 4.760e9 | -0.60% | | real/eff/VS || | 2.285e9 | +0.20% | | real/eff/VSD || | 8.315e7 | +0.02% | | real/eff/VSM || | 9.480e8 | +1.48% | | real/fem || | 6.641e9 | -0.53% | | real/fluid || | 3.914e9 | +0.00% | | real/fulsom || | 2.497e9 | -0.22% | | real/gamteb || | 1.013e10 | -0.01% | | real/gg || | 7.243e9 | +0.12% | | real/grep || | 7.563e9 | -0.10% | | real/hidden || | 7.209e9 | +1.57% | | real/hpg || | 4.982e9 | +0.91% | | real/infer || | 8.312e9 | +0.11% | | real/lift || | 4.441e9 | -0.18% | | real/linear || | 8.438e9 | +1.90% | | real/maillist || | 4.297e9 | -0.94% | | real/mkhprog || | 2.874e7 | -0.06% | | real/parser || | 5.177e9 | +0.14% | | real/pic || | 3.265e9 | +0.10% | | real/prolog || | 5.755e9 | -0.18% | | real/reptile || | 6.050e9 | +0.07% | | real/rsa || | 7.177e9 | +0.03% | | real/scs || | 6.184e9 | -0.23% | | real/smallpt || | 1.129e10 | -0.16% | | real/symalg || | 8.247e9 | -0.14% | | real/veritas || | 4.833e9 | -0.01% | | shootout/binary-trees || | 1.071e10 | +0.12% | | shootout/fannkuch-redux || | 1.912e10 | +0.12% | | shootout/fasta || | 4.273e9 | -0.50% | | shootout/k-nucleotide || | 4.227e9 | -1.34% | | shootout/n-body || | 3.725e9 | -0.23% | | shootout/pidigits || | 8.095e9 | -0.04% | | shootout/reverse-complement || | 3245583.000 | -2.41% | | shootout/spectral-norm || | 4.238e9 | -0.15% | | smp/callback001 || | 1.601e9 | +0.55% | | smp/callback002 || | 2.619e9 | +0.19% | | smp/chan || | 7.817e9 | -0.01% | | smp/sieve || | 2.361e9 | +0.85% | | smp/threads001 || | 5.145e9 | +0.17% | | smp/threads003 || | 2.922e9 | -0.06% | | smp/threads006 || | 1.081e9 | +4.82% | | smp/threads007 || | 4.328e9 | +0.63% | | spectral/ansi || | 5.961e9 | +0.21% | | spectral/atom || | 5.864e9 | -0.10% | | spectral/awards || | 8.749e9 | -0.02% | | spectral/banner || | 8.862e9 | +0.12% | | spectral/boyer || | 7.669e9 | -0.09% | | spectral/boyer2 || | 8.888e9 | +0.04% | | spectral/calendar || | 7.541e9 | +0.13% | | spectral/cichelli || | 8.675e9 | -0.17% | | spectral/circsim || | 6.901e9 | +0.12% | | spectral/clausify || | 6.227e9 | -0.09% | | spectral/constraints || | 8.308e9 | +0.36% | | spectral/cryptarithm1 || | 7.804e9 | -0.23% | | spectral/cryptarithm2 || | 6.757e9 | +0.11% | | spectral/cse || | 6.357e9 | +0.01% | | spectral/dom-lt || | 7.774e9 | +0.17% | | spectral/eliza || | 8.279e9 | -0.12% | | spectral/exact-reals || | 5.599e9 | -0.07% | | spectral/expert || | 5.096e9 | -0.09% | | spectral/fft2 || | 8.818e9 | +0.48% | | spectral/fibheaps || | 8.019e9 | -0.12% | | spectral/fish || | 7.319e9 | -0.03% | | spectral/gcd || | 6.381e9 | +0.26% | | spectral/hartel/comp_lab_zift || | 8.747e9 | -0.45% | | spectral/hartel/event || | 9.153e9 | -1.50% | | spectral/hartel/fft || | 3.237e9 | -0.02% | | spectral/hartel/genfft || | 1.020e10 | +0.14% | | spectral/hartel/ida || | 5.420e9 | -0.32% | | spectral/hartel/listcompr || | 6.143e9 | +0.12% | | spectral/hartel/listcopy || | 6.759e9 | +0.01% | | spectral/hartel/nucleic2 || | 4.413e9 | -0.67% | | spectral/hartel/parstof || | 5.552e9 | +0.04% | | spectral/hartel/sched || | 5.807e9 | -0.02% | | spectral/hartel/solid || | 5.850e9 | +0.22% | | spectral/hartel/transform || | 5.713e9 | -0.01% | | spectral/hartel/typecheck || | 5.844e9 | -0.04% | | spectral/hartel/wang || | 8.727e9 | +0.29% | | spectral/hartel/wave4main || | 6.034e9 | -0.20% | | spectral/integer || | 7.048e9 | +0.64% | | spectral/knights || | 8.310e9 | -0.08% | | spectral/lambda || | 8.091e9 | -0.12% | | spectral/last-piece || | 1.877e9 | +0.11% | | spectral/lcss || | 8.776e9 | -0.10% | | spectral/life || | 9.143e9 | -0.05% | | spectral/mandel || | 7.015e9 | +0.24% | | spectral/mandel2 || | 3.957e9 | +0.03% | | spectral/mate || | 7.573e9 | +0.11% | | spectral/minimax || | 8.645e9 | +0.10% | | spectral/multiplier || | 6.097e9 | +0.06% | | spectral/para || | 6.562e9 | +0.03% | | spectral/power || | 6.758e9 | -0.23% | | spectral/pretty || | 3371581.000 | -0.75% | | spectral/primetest || | 7.409e9 | -0.04% | | spectral/puzzle || | 6.405e9 | -0.19% | | spectral/rewrite || | 5.558e9 | +0.62% | | spectral/scc || | 3244220.000 | -1.55% | | spectral/simple || | 1.220e10 | +0.25% | | spectral/sorting || | 9.082e9 | -0.05% | | spectral/sphere || | 5.371e9 | -0.18% | | spectral/treejoin || | 9.881e9 | -0.07% | +===============================++==+=============+==================+ | geom mean || | +0.02% | | +-------------------------------++--+-------------+------------------+
# perf cycles
+-------------------------------++--+-------------+------------------+ | || | master/ | callstack/ (rel) | +===============================++==+=============+==================+ | imaginary/bernouilli || | 3.726e9 | +0.96% | | imaginary/digits-of-e1 || | 2.561e9 | +3.96% | | imaginary/digits-of-e2 || | 2.828e9 | -1.96% | | imaginary/exp3_8 || | 3.231e9 | +2.40% | | imaginary/gen_regexps || | 4.250e9 | +0.26% | | imaginary/integrate || | 2.968e9 | -9.55% | | imaginary/kahan || | 3.062e9 | -0.40% | | imaginary/paraffins || | 3.083e9 | -1.94% | | imaginary/primes || | 2.593e9 | +1.49% | | imaginary/queens || | 4.713e9 | -0.75% | | imaginary/rfib || | 3.942e9 | -0.09% | | imaginary/tak || | 4.385e9 | -0.60% | | imaginary/wheel-sieve1 || | 4.582e9 | -43.27% | | imaginary/wheel-sieve2 || | 2.563e9 | -2.37% | | imaginary/x2n1 || | 2.867e9 | +0.10% | | parallel/blackscholes || | 4.854e9 | -1.40% | | parallel/coins || | 4.809e9 | -0.08% | | parallel/gray || | 3.600e9 | +2.96% | | parallel/mandel || | 1.481e10 | -1.08% | | parallel/matmult || | 1.570e10 | -2.83% | | parallel/minimax || | 2.420e10 | +7.85% | | parallel/nbody || | 4.377e8 | +1.37% | | parallel/parfib || | 1.752e10 | +0.16% | | parallel/partree || | 3.345e9 | +2.19% | | parallel/prsa || | 7.052e9 | +6.03% | | parallel/queens || | 4.686e9 | +0.06% | | parallel/ray || | 9.246e9 | -2.73% | | parallel/sumeuler || | 4.166e9 | -1.20% | | parallel/transclos || | 1.095e10 | +1.05% | | real/anna || | 5.456e9 | -0.28% | | real/ben-raytrace || | 6.268e10 | +2.87% | | real/bspt || | 3.695e9 | -0.12% | | real/cacheprof || | 3.822e9 | +5.28% | | real/compress || | 2.389e9 | -0.41% | | real/compress2 || | 3.284e9 | -4.00% | | real/eff/CS || | 1.825e8 | +0.07% | | real/eff/CSD || | 1.185e9 | -0.92% | | real/eff/FS || | 9.959e8 | +8.14% | | real/eff/S || | 2.161e9 | +3.14% | | real/eff/VS || | 9.353e8 | -4.17% | | real/eff/VSD || | 2.326e7 | +3.42% | | real/eff/VSM || | 3.006e8 | -15.15% | | real/fem || | 3.274e9 | -5.66% | | real/fluid || | 3.224e9 | -2.00% | | real/fulsom || | 1.922e9 | -1.85% | | real/gamteb || | 5.555e9 | -0.95% | | real/gg || | 3.717e9 | +6.49% | | real/grep || | 3.266e9 | -4.20% | | real/hidden || | 5.666e9 | -6.63% | | real/hpg || | 3.082e9 | +8.56% | | real/infer || | 4.526e9 | +4.02% | | real/lift || | 3.450e9 | -0.91% | | real/linear || | 6.195e9 | -3.28% | | real/maillist || | 3.815e9 | -3.44% | | real/mkhprog || | 1.859e7 | -4.29% | | real/parser || | 3.315e9 | +1.96% | | real/pic || | 2.259e9 | -2.02% | | real/prolog || | 4.197e9 | +0.39% | | real/reptile || | 3.234e9 | -1.87% | | real/rsa || | 2.852e9 | -1.52% | | real/scs || | 2.870e9 | -2.91% | | real/smallpt || | 7.328e9 | +0.78% | | real/symalg || | 3.427e9 | +0.10% | | real/veritas || | 2.909e9 | +0.50% | | shootout/binary-trees || | 5.018e9 | -0.06% | | shootout/fannkuch-redux || | 1.014e10 | -2.68% | | shootout/fasta || | 2.439e9 | +1.45% | | shootout/k-nucleotide || | 3.488e9 | +4.66% | | shootout/n-body || | 2.098e9 | -0.03% | | shootout/pidigits || | 3.265e9 | -0.18% | | shootout/reverse-complement || | 3311908.000 | -6.15% | | shootout/spectral-norm || | 1.525e9 | +0.62% | | smp/callback001 || | 8.318e8 | +9.35% | | smp/callback002 || | 1.337e9 | +5.34% | | smp/chan || | 3.236e9 | -0.99% | | smp/sieve || | 7.368e8 | -0.27% | | smp/threads001 || | 2.874e9 | -0.77% | | smp/threads003 || | 1.841e9 | -0.36% | | smp/threads006 || | 1.144e9 | +2.09% | | smp/threads007 || | 3.534e9 | +3.85% | | spectral/ansi || | 1.973e9 | -2.41% | | spectral/atom || | 2.944e9 | -0.80% | | spectral/awards || | 5.452e9 | -11.68% | | spectral/banner || | 4.185e9 | -0.68% | | spectral/boyer || | 4.195e9 | -1.23% | | spectral/boyer2 || | 4.586e9 | -1.21% | | spectral/calendar || | 3.726e9 | -1.97% | | spectral/cichelli || | 4.325e9 | -0.26% | | spectral/circsim || | 5.746e9 | -0.23% | | spectral/clausify || | 3.735e9 | +0.10% | | spectral/constraints || | 5.202e9 | +2.10% | | spectral/cryptarithm1 || | 3.909e9 | -4.03% | | spectral/cryptarithm2 || | 3.759e9 | -1.27% | | spectral/cse || | 4.564e9 | -2.83% | | spectral/dom-lt || | 4.830e9 | -0.05% | | spectral/eliza || | 4.631e9 | -6.18% | | spectral/exact-reals || | 3.471e9 | -0.08% | | spectral/expert || | 4.020e9 | -1.27% | | spectral/fft2 || | 4.706e9 | -1.71% | | spectral/fibheaps || | 4.492e9 | +0.55% | | spectral/fish || | 4.004e9 | +3.76% | | spectral/gcd || | 3.413e9 | -2.86% | | spectral/hartel/comp_lab_zift || | 5.377e9 | +4.10% | | spectral/hartel/event || | 5.456e9 | -1.84% | | spectral/hartel/fft || | 1.732e9 | +0.20% | | spectral/hartel/genfft || | 5.124e9 | +2.82% | | spectral/hartel/ida || | 4.414e9 | +2.00% | | spectral/hartel/listcompr || | 3.458e9 | +3.84% | | spectral/hartel/listcopy || | 3.776e9 | -4.30% | | spectral/hartel/nucleic2 || | 4.137e9 | +4.49% | | spectral/hartel/parstof || | 4.609e9 | -0.54% | | spectral/hartel/sched || | 4.245e9 | -0.19% | | spectral/hartel/solid || | 3.587e9 | +1.04% | | spectral/hartel/transform || | 3.793e9 | +4.13% | | spectral/hartel/typecheck || | 4.627e9 | -1.51% | | spectral/hartel/wang || | 4.369e9 | -1.01% | | spectral/hartel/wave4main || | 4.844e9 | -5.68% | | spectral/integer || | 3.150e9 | -5.21% | | spectral/knights || | 4.198e9 | +21.03% | | spectral/lambda || | 3.534e9 | +1.90% | | spectral/last-piece || | 1.134e9 | +0.65% | | spectral/lcss || | 3.905e9 | -0.64% | | spectral/life || | 5.646e9 | -6.52% | | spectral/mandel || | 3.529e9 | -6.31% | | spectral/mandel2 || | 2.570e9 | -0.24% | | spectral/mate || | 5.761e9 | +4.42% | | spectral/minimax || | 4.569e9 | -1.24% | | spectral/multiplier || | 3.060e9 | +6.04% | | spectral/para || | 4.232e9 | +1.90% | | spectral/power || | 3.808e9 | -1.38% | | spectral/pretty || | 3403388.000 | -22.39% | | spectral/primetest || | 3.203e9 | -4.45% | | spectral/puzzle || | 4.362e9 | -0.34% | | spectral/rewrite || | 3.840e9 | +4.16% | | spectral/scc || | 3133857.000 | +1.57% | | spectral/simple || | 7.219e9 | -1.59% | | spectral/sorting || | 4.285e9 | -0.29% | | spectral/sphere || | 3.674e9 | -3.88% | | spectral/treejoin || | 4.910e9 | +0.19% | +===============================++==+=============+==================+ | geom mean || | -0.80% | | +-------------------------------++--+-------------+------------------+
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
participants (17)
-
Andreas Abel
-
Artem Pelenitsyn
-
Bryan Richter
-
Carter Schonwald
-
chessai
-
David Feuer
-
Edward Kmett
-
Fumiaki Kinoshita
-
George Wilson
-
Henning Thielemann
-
Henrik Nilsson
-
Hécate
-
Mario Blažević
-
Oleg Grenrus
-
Ryan Trinkle
-
Simon Jakobi
-
Tom Ellis