[GHC] #14928: TH eats 50 GB memory when creating ADT with multiple constructors

GHC ghc-devs at haskell.org
Fri Jun 8 13:45:52 UTC 2018


#14928: TH eats 50 GB memory when creating ADT with multiple constructors
-------------------------------------+-------------------------------------
        Reporter:  YitzGale          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Template Haskell  |              Version:  8.2.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 While I don't doubt that we could (and should!) do a better job of
 compiling code like this, I would suggest that regular structures like
 this should really be encoded as a data structure, not code as is done
 here. Not only does compiling all of these large cases produce a great
 deal of work for the compiler but it's also inefficient. For instance, the
 Core produced by the `snoyberg-master` essentially implements an linear
 search over languages, doing a string comparison for every language for
 which localizations are available:
 {{{#!hs
           case ds_doaz of {
             MsgTestLocalizationMessage001 ->
               case ==
                      @ I18N.Lang
                      Data.Text.$fEqText
                      lang_a53E
                      (Data.Text.pack (GHC.CString.unpackCString# "da"#))
               of {
                 False ->
                   case ==
                          @ I18N.Lang
                          Data.Text.$fEqText
                          lang_a53E
                          (Data.Text.pack (GHC.CString.unpackCString# "da-
 DK"#))
                   of {
                     False -> ...
                     True ->
                       Data.Text.pack
                         (GHC.CString.unpackCString#
                            "This is test localization message number 1 in
 da-DK."#)
                   };
                 True ->
                   Data.Text.pack
                     (GHC.CString.unpackCString#
                        "This is test localization message number 1 in
 da."#)
               };
 }}}
 Surely this would be better implemented as a hash-map or some other
 structure with sublinear lookup.

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


More information about the ghc-tickets mailing list