[GHC] #15176: Superclass `Monad m =>` makes program run 100 times slower
GHC
ghc-devs at haskell.org
Tue Sep 4 11:19:05 UTC 2018
#15176: Superclass `Monad m =>` makes program run 100 times slower
-------------------------------------+-------------------------------------
Reporter: danilo2 | Owner: osa1
Type: bug | Status: new
Priority: highest | Milestone: 8.8.1
Component: Compiler | Version: 8.4.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Runtime | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by osa1):
I managed to reproduce this. The original instructions no longer work (the
git repo disappeared, the branch doesn't exist in the new repo etc.) so
here is what I did to reproduce:
- Clone https://github.com/luna/luna.git
- Run benchmark: `stack bench luna-core`
- Apply this patch:
{{{
diff --git a/core/src/Data/Graph/Fold/Layer.hs
b/core/src/Data/Graph/Fold/Layer.hs
index 28d6c6cd..45150ff1 100644
--- a/core/src/Data/Graph/Fold/Layer.hs
+++ b/core/src/Data/Graph/Fold/Layer.hs
@@ -141,7 +141,7 @@ instance Monad m => Fold.Builder (Scoped s) m
(SmallVectorA t alloc n a)
-- === FoldableLayers === --
-class LayersFoldableBuilder__ t (layers :: [Type]) m where
+class Monad m => LayersFoldableBuilder__ t (layers :: [Type]) m where
buildLayersFold__ :: SomePtr -> m (Fold.Result t) -> m (Fold.Result
t)
instance Monad m => LayersFoldableBuilder__ t '[] m where
diff --git a/core/src/Data/Graph/Fold/LayerMap.hs
b/core/src/Data/Graph/Fold/LayerMap.hs
index 4b12bbf6..e5e54e45 100644
--- a/core/src/Data/Graph/Fold/LayerMap.hs
+++ b/core/src/Data/Graph/Fold/LayerMap.hs
@@ -117,7 +117,7 @@ instance Monad m => Fold.Builder (Scoped s) m
(SmallVectorA t alloc n a)
-- === FoldableLayers === --
-class LayersFoldableBuilder__ t (layers :: [Type]) m where
+class Monad m => LayersFoldableBuilder__ t (layers :: [Type]) m where
buildLayersFold__ :: SomePtr -> m (Fold.Result t) -> m (Fold.Result
t)
instance Monad m => LayersFoldableBuilder__ t '[] m where
diff --git a/core/src/Data/Graph/Fold/Scoped.hs
b/core/src/Data/Graph/Fold/Scoped.hs
index 2fade0f3..2e6b51df 100644
--- a/core/src/Data/Graph/Fold/Scoped.hs
+++ b/core/src/Data/Graph/Fold/Scoped.hs
@@ -131,7 +131,7 @@ instance Monad m => Fold.Builder (Scoped t) m
(SmallVectorA s alloc n a)
-- === FoldableLayers === --
-class LayersFoldableBuilder__ t (layers :: [Type]) m where
+class Monad m => LayersFoldableBuilder__ t (layers :: [Type]) m where
buildLayersFold__ :: SomePtr -> m (Fold.Result t) -> m (Fold.Result
t)
instance Monad m => LayersFoldableBuilder__ t '[] m where
diff --git a/core/src/Data/Graph/Fold/ScopedMap.hs
b/core/src/Data/Graph/Fold/ScopedMap.hs
index 217c55a6..4a3d34c8 100644
--- a/core/src/Data/Graph/Fold/ScopedMap.hs
+++ b/core/src/Data/Graph/Fold/ScopedMap.hs
@@ -129,7 +129,7 @@ instance Monad m => Fold.Builder (ScopedMap s) m
(SmallVectorA t alloc n a)
-- === FoldableLayers === --
-class LayersFoldableBuilder__ t (layers :: [Type]) m where
+class Monad m => LayersFoldableBuilder__ t (layers :: [Type]) m where
buildLayersFold__ :: SomePtr -> m (Fold.Result t) -> m (Fold.Result
t)
instance Monad m => LayersFoldableBuilder__ t '[] m where
}}}
- Run benchmarks again
Most of the benchmarks are not effected, but there are three benchmarks
which are effected quite significantly by this change:
Before the patch:
{{{
benchmarking ir/discovery/generic/10e6
time 61.47 ms (61.14 ms .. 61.80 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 61.02 ms (60.79 ms .. 61.20 ms)
std dev 367.5 μs (224.7 μs .. 582.3 μs)
benchmarking ir/discovery/partitions single var/10e6
time 93.94 ms (93.22 ms .. 94.75 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 93.57 ms (92.95 ms .. 93.94 ms)
std dev 746.7 μs (377.0 μs .. 1.245 ms)
benchmarking ir/discovery/partitions unify/10e6
time 518.7 ms (508.2 ms .. 523.9 ms)
1.000 R² (1.000 R² .. 1.000 R²)
mean 515.6 ms (512.3 ms .. 516.9 ms)
std dev 2.350 ms (717.7 μs .. 3.196 ms)
variance introduced by outliers: 19% (moderately inflated)
}}}
After the patch:
{{{
benchmarking ir/discovery/generic/10e6
time 1.309 s (1.283 s .. 1.326 s)
1.000 R² (1.000 R² .. 1.000 R²)
mean 1.320 s (1.312 s .. 1.334 s)
std dev 13.24 ms (767.0 μs .. 16.27 ms)
variance introduced by outliers: 19% (moderately inflated)
benchmarking ir/discovery/partitions single var/10e6
time 1.355 s (1.351 s .. 1.359 s)
1.000 R² (1.000 R² .. 1.000 R²)
mean 1.357 s (1.356 s .. 1.359 s)
std dev 1.415 ms (1.209 ms .. 1.452 ms)
variance introduced by outliers: 19% (moderately inflated)
benchmarking ir/discovery/partitions unify/10e6
time 5.459 s (5.438 s .. 5.501 s)
1.000 R² (1.000 R² .. 1.000 R²)
mean 5.444 s (5.435 s .. 5.452 s)
std dev 11.24 ms (7.336 ms .. 13.71 ms)
variance introduced by outliers: 19% (moderately inflated)
}}}
Summary:
- ir/discovery/generic/10e6: 21x increase
- ir/discovery/partitions single var/10e6: 14x increase
- ir/discovery/partitions unify/10e6: 10x increase
No ideas why yet.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15176#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list