[GHC] #13360: Add a flag to enable inferring HasCallStack constraints

GHC ghc-devs at haskell.org
Fri Nov 10 14:36:15 UTC 2017


#13360: Add a flag to enable inferring HasCallStack constraints
-------------------------------------+-------------------------------------
        Reporter:  gridaphobe        |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by saurabhnanda):

 **I think we are aren't approaching this pragmatically.** The 3.4x
 penalty, reported above, occurs only when every single computation throws
 an error and the error/callstack is forced (usually by printing it to a
 log-file). **However** in real life only a certain percentage of
 computations fail, and most of the times the callstacks aren't evaluated
 completely. (I tried a version where `e deepseq` wasn't being called and
 every version of the code had the same perf.

 Here are some benchmarks where **only 20% computations fail**.
 [https://github.com/vacationlabs/hascallstack-
 benchmarks/blob/84ab56c63eb96208c5193a187b431251037a2ce8/app/Main.hs: code
 is here] The perf penalty is now **~1.2x** for the `HasCallStack` version.
 I think there is still some opportunity to optimise the stack entries, but
 the perf penalty in real-world scenarios is not as alarming as I had
 earlier reported.

 **This is going to be 'Exhibit A' whenever I need to cite advantages of
 lazy evaluation**

 {{{
 benchmarking recur/no callstack/1000
 time                 1.720 ms   (1.648 ms .. 1.776 ms)
                      0.992 R²   (0.987 R² .. 0.996 R²)
 mean                 1.668 ms   (1.638 ms .. 1.703 ms)
 std dev              117.6 μs   (97.03 μs .. 144.4 μs)
 variance introduced by outliers: 53% (severely inflated)

 benchmarking recur/HasCallStack/1000
 time                 1.700 ms   (1.660 ms .. 1.742 ms)
                      0.994 R²   (0.990 R² .. 0.997 R²)
 mean                 1.725 ms   (1.695 ms .. 1.762 ms)
 std dev              117.1 μs   (95.96 μs .. 150.7 μs)
 variance introduced by outliers: 52% (severely inflated)

 benchmarking recur/explicit callstack/1000
 time                 1.740 ms   (1.701 ms .. 1.782 ms)
                      0.994 R²   (0.991 R² .. 0.997 R²)
 mean                 1.746 ms   (1.710 ms .. 1.779 ms)
 std dev              126.3 μs   (101.9 μs .. 158.5 μs)
 variance introduced by outliers: 53% (severely inflated)

 benchmarking recur/explicit callstack (mini)/1000
 time                 1.694 ms   (1.639 ms .. 1.758 ms)
                      0.988 R²   (0.976 R² .. 0.995 R²)
 mean                 1.735 ms   (1.701 ms .. 1.783 ms)
 std dev              135.1 μs   (102.7 μs .. 180.1 μs)
 variance introduced by outliers: 58% (severely inflated)

 benchmarking recur/no callstack/10000
 time                 16.70 ms   (14.62 ms .. 18.45 ms)
                      0.941 R²   (0.888 R² .. 0.975 R²)
 mean                 19.34 ms   (18.32 ms .. 20.57 ms)
 std dev              2.575 ms   (1.965 ms .. 3.431 ms)
 variance introduced by outliers: 62% (severely inflated)

 benchmarking recur/HasCallStack/10000
 time                 20.03 ms   (18.44 ms .. 21.43 ms)
                      0.955 R²   (0.911 R² .. 0.979 R²)
 mean                 19.07 ms   (17.62 ms .. 20.33 ms)
 std dev              3.299 ms   (2.438 ms .. 4.141 ms)
 variance introduced by outliers: 71% (severely inflated)

 benchmarking recur/explicit callstack/10000
 time                 21.81 ms   (20.15 ms .. 22.95 ms)
                      0.967 R²   (0.919 R² .. 0.993 R²)
 mean                 21.22 ms   (19.91 ms .. 22.07 ms)
 std dev              2.337 ms   (1.799 ms .. 3.171 ms)
 variance introduced by outliers: 51% (severely inflated)

 benchmarking recur/explicit callstack (mini)/10000
 time                 18.23 ms   (15.22 ms .. 20.59 ms)
                      0.904 R²   (0.825 R² .. 0.960 R²)
 mean                 20.31 ms   (18.68 ms .. 21.64 ms)
 std dev              3.227 ms   (2.640 ms .. 3.903 ms)
 variance introduced by outliers: 71% (severely inflated)

 benchmarking recur/no callstack/100000
 time                 199.8 ms   (119.6 ms .. 283.6 ms)
                      0.857 R²   (0.493 R² .. 1.000 R²)
 mean                 199.5 ms   (152.1 ms .. 232.5 ms)
 std dev              49.70 ms   (37.44 ms .. 59.33 ms)
 variance introduced by outliers: 65% (severely inflated)

 benchmarking recur/HasCallStack/100000
 time                 210.9 ms   (166.5 ms .. 262.5 ms)
                      0.970 R²   (0.924 R² .. 1.000 R²)
 mean                 170.5 ms   (152.4 ms .. 188.6 ms)
 std dev              21.57 ms   (13.10 ms .. 33.13 ms)
 variance introduced by outliers: 32% (moderately inflated)

 benchmarking recur/explicit callstack/100000
 time                 288.3 ms   (229.0 ms .. 398.6 ms)
                      0.965 R²   (0.893 R² .. 1.000 R²)
 mean                 242.8 ms   (192.7 ms .. 270.7 ms)
 std dev              48.74 ms   (11.69 ms .. 64.53 ms)
 variance introduced by outliers: 57% (severely inflated)

 benchmarking recur/explicit callstack (mini)/100000
 time                 215.5 ms   (73.60 ms .. 322.8 ms)
                      0.804 R²   (0.327 R² .. 1.000 R²)
 mean                 212.8 ms   (157.4 ms .. 242.9 ms)
 std dev              50.88 ms   (24.98 ms .. 66.53 ms)
 variance introduced by outliers: 65% (severely inflated)
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13360#comment:26>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list