Repository navigation
Performance regressions from ghc-9.12 to ghc-9.14 #3200
Copy link
Copy link
Open
Labels
type:performanceimpacts performanceimpacts performance
Milestone
Description
Allocations change from ghc-9.12.4 to 9.14.1
Benchmark default(0)(Bytes) default(1) - default(0)(%)
--------------------------------------------------------------------------------------------------- -------------- --------------------------
All.Data.Unfold/o-1-space.transformation/input.swap 84.00 +3809553.57
All.Data.Unfold/o-1-space.transformation/input.first 84.00 +3809547.62
All.Data.Unfold/o-1-space.generation.enumerateFromIntegral 88.00 +3636380.68
All.Data.Unfold/o-1-space.transformation/input.second 89.00 +3595606.74
All.Data.Unfold/o-1-space.generation.enumerateFromThenIntegral 186.00 +1720385.48
All.Data.StreamK/o-1-space.list.Monad.drain3 4445.00 +248136.22
All.Data.StreamK/o-1-space.list.Applicative.drain2 22982.00 +45552.23
All.Data.StreamK/o-1-space.list.Monad.drain2 23885.00 +43826.36
All.Data.StreamK/o-1-space.list.Monad.filterAllIn2 22982.00 +31571.32
All.Data.Stream/o-1-space.elimination.reduce.Identity.foldl' 40.00 +7827.50
All.Data.Stream/o-1-space.elimination.reduce.Identity.foldl1' 56.00 +2783.93
All.Data.Stream/o-1-space.mappingX4.scanl1' 156.00 +1274.36
All.Data.Stream/o-1-space.mapping.postscan 121.00 +817.36
All.Data.Stream/o-1-space.pipesX4.tee 124.00 +787.10
All.Data.Stream/o-1-space.elimination.findM 153.00 +655.56
All.Data.Stream/o-1-space.indexingx4.indexed 84.00 +607.14
All.Data.Stream/o-1-space.elimination.mapM_ 89.00 +567.42
All.Data.Stream/o-1-space.elimination.length 104.00 +495.19
All.Data.Stream/o-1-space.elimination.or 211.00 +478.67
All.Data.Fold/o-1-space.elimination.all 213.00 +379.34
All.Data.Fold/o-1-space.elimination.last 120.00 +360.83
All.Data.Array/o-1-space.generation.write . intFromTo 2096483.00 +343.45
All.Data.MutArray/o-1-space.generation.write . intFromTo 2096520.00 +343.44
All.Data.Fold/o-1-space.transformation.pipe-mapM 122.00 +313.11
All.Data.Stream/o-1-space.mappingX4.trace 84.00 +301.19
All.Data.Parser/o-1-space.groupByRolling 201.00 +283.58
All.Data.Fold/o-1-space.transformation.rsequence 89.00 +215.73
All.Data.Fold/o-1-space.elimination.any 193.00 +208.29
All.peek.RecCompatible 1349.00 +202.74
All.Data.Array/o-n-space.elimination.createOfLast.Max 4800621.00 +199.99
CPU Time changes.
Benchmark default(0)(us) default(1) - default(0)(%)
------------------------------------------------------------------------ -------------- --------------------------
All.Data.Unfold/o-1-space.transformation/input.second 32.18 +2182.14
All.Data.Unfold/o-1-space.generation.enumerateFromThenIntegral 32.66 +2143.01
All.Data.Unfold/o-1-space.transformation/input.first 32.26 +2070.58
All.Data.Unfold/o-1-space.generation.enumerateFromIntegral 32.05 +1975.32
All.Data.Unfold/o-1-space.transformation/input.swap 32.49 +1893.48
All.Data.StreamK/o-1-space.list.Monad.drain2 419.87 +267.73
All.Data.StreamK/o-1-space.list.Applicative.drain2 430.44 +261.70
All.Data.StreamK/o-1-space.list.Monad.drain3 437.67 +250.60
All.Data.MutArray/o-1-space.generation.write . intFromTo 363.57 +149.08
All.Data.Array/o-1-space.generation.write . intFromTo 355.00 +141.31
All.Data.Fold/o-1-space.elimination.index 65.96 +140.85
All.Data.Stream/o-1-space.multi-stream.eqBy 80.96 +135.26
All.Data.Stream/o-1-space.filteringX4.takeWhile-true 40.62 +134.72
All.Data.Stream/o-1-space.elimination.(!!) 97.19 +131.94
All.Data.Array/o-1-space.generation.writeN . unfoldr 85.20 +131.83
All.Data.StreamK/o-1-space.list.Monad.filterAllIn2 424.93 +131.74
CPU Time changes.
Benchmark default(0)(us) default(1) - default(0)(%)
--------------------------------------------------------------------------------------------------- -------------- --------------------------
All.Data.Array/o-n-space.elimination.createOfLast.Max 698.00 +230.03
All.Data.Array/o-1-space.generation.write . intFromTo 355.00 +141.31
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq single a 119385.00 +70.05
All.Data.Stream/o-1-space.FileSplitElem.splitOn infix lf 101672.00 +67.29
All.Data.Fold/o-1-space.FileSplitSeq.takeEndBySeq_ infix empty pattern 63192.10 +59.05
All.Data.Stream/o-1-space.exceptions.Stream.after_ (1/10) 11646.00 +43.59
All.Data.Fold/o-1-space.FileSplitSeq.takeEndBySeq_ infix abcdefghi 1168430.00 +43.38
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq_ KR catcatcatcatcat 626663.00 +41.08
All.Data.Fold/o-1-space.FileSplitSeq.takeEndBySeq_ infix abcdefghijklmnopqrstuvwxyz 1225510.00 +39.56
All.Data.Fold/o-1-space.FileSplitSeq.takeEndBySeq_ infix catcatcatcatcat 1258930.00 +37.13
All.Data.Array/o-1-space.transformationX4.map 611.00 +35.57
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq_ KR abcdefghi 622364.00 +31.97
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq_ KR abcdefghijklmnopqrstuvwxyz 659288.00 +29.88
All.Data.StreamK/o-1-space.generation.fromFoldable 504.64 +24.62
All.Data.StreamK/o-1-space.elimination.uncons 679.56 +19.67
All.Data.Stream/o-1-space.grouping.groupsByRollingEq 1005.03 +18.28
All.Data.StreamK/o-n-space.concat.concatMapWithD D.roundRobin outer=inner=(sqrt Max) 146223.00 +18.15
All.Data.Fold.Window/o-1-space.fold.minimum (window size 100) 567.73 +17.14
All.Data.Fold/o-1-space.composition.unfoldMany 2045.52 +15.34
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq_ single a 297721.00 +14.82
All.Data.Stream/o-1-space.elimination.build.Identity.foldrMToListLength 633.53 +14.50
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq word aaaa 451841.00 +14.03
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq word abcdefgh 452065.00 +13.88
All.Data.Stream/o-1-space.FileTakeSeq.takeEndBySeq word aa 454456.00 +13.66
All.Data.StreamK/o-1-space.mixedX4.take-map 7686.05 +13.32
All.Data.ParserK/o-n-heap.sequence_ 2575.45 +13.19
All.Data.Stream/o-1-space.generation.enumerateFromThen 1043.47 +12.52
All.Data.StreamK/o-1-space.generation.iterate 992.62 +11.68
All.Data.Stream/o-1-space.mixed.foldl-map 10336.20 +11.52
All.Data.Fold.Window/o-1-space.fold.maximum (window size 100) 581.53 +10.74
All.Data.StreamK/o-1-space.elimination.foldlM' 877.28 +10.33
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
type:performanceimpacts performanceimpacts performance
Activity
ysangkok commentedon May 26, 2026
Are there any upstream GHC bugs that could be causing any of these regressions?
harendra-kumar commentedon May 28, 2026
May or may not be, more investigation is needed to establish that. We need to check the differences in the generated core to see what is happening. Sometimes changing some optimization thresholds, options helps. Some of them may be due to some genuine issue with GHC as has happened in past as well, but I suspect a lot of it can be removed by changing inlining, specialization pragmas, phases or writing code in a slightly different way etc depending on what we find in the core. And possibly learn lessons so that GHC optimizations can be made more robust.