
#10528: compile time performance regression with OverloadedStrings and Text -------------------------------------+------------------------------------- Reporter: jakewheat | Owner: bgamari Type: bug | Status: new Priority: high | Milestone: 7.10.3 Component: Compiler | Version: 7.10.2-rc2 Resolution: | Keywords: Operating System: Linux | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by simonpj): Right, so after your second bullet (end of phase 1) we have something reasonable (this is for a list with two strings in it): {{{ -- RHS size: {terms: 6, types: 1, coercions: 0} a_s3zW :: Text [LclId, Str=DmdType, Unf=Unf{Src=<vanilla>, TopLvl=True, Value=False, ConLike=False, WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 120 0}] a_s3zW = Data.Text.Internal.Fusion.unstream (Data.Text.Internal.Fusion.Common.map Data.Text.Internal.safe (Data.Text.Internal.Fusion.Common.streamList @ Char (unpackCString# "abstime"#))) -- RHS size: {terms: 6, types: 1, coercions: 0} a_s3zY :: Text [LclId, Str=DmdType, Unf=Unf{Src=<vanilla>, TopLvl=True, Value=False, ConLike=False, WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 120 0}] a_s3zY = Data.Text.Internal.Fusion.unstream (Data.Text.Internal.Fusion.Common.map Data.Text.Internal.safe (Data.Text.Internal.Fusion.Common.streamList @ Char (unpackCString# "aclitem"#))) -- RHS size: {terms: 3, types: 2, coercions: 0} a_s3zX :: [Text] [LclId, Str=DmdType, Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 30}] a_s3zX = : @ Text a_s3zY ([] @ Text) -- RHS size: {terms: 3, types: 1, coercions: 0} strings :: [Text] [LclIdX, Str=DmdType, Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 30}] strings = : @ Text a_s3zW a_s3zX }}} The `unstream/map/safe/streamList` is the result of inlining `Data.Text.pack`. I suppose it's ok to have that much for every literal string. But then in the next pass (phase 0) we inline `unstream`, which is pretty big; and `Data.Text.Internal.Fusion.Common.map` and `Data.Text.Internal.safe` and `Data.Text.Internal.Fusion.Common.streamList`. All of these are inlined because of an INLINE pragma. So we are inlining boat-loads of code, under explicit user guidance, but for no purpose. I say this is the fault of the `text` library, not of GHC! What do you ''want'' to happen for literal strings? I don't know what has changed. Has `text` changed? I think the same thing should happen with any version of GHC though I have not tried. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10528#comment:8 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler