
#16190: Speed up handling of large String literals -------------------------------------+------------------------------------- Reporter: hsyl20 | Owner: (none) Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.6.3 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 hsyl20): New approach: instead of messing with Core, we only add the optimization into the NCG. For large strings, instead of printing `.asciz "..."` we print `.incbin "tmpfileXXX.dat"` and we dump the contents of the string into "tmpfileXXX.dat". This relies on the patch for #16198 so that we benefit from ByteStrings for string literals down to the NCG. I have updated the branch: https://gitlab.haskell.org/hsyl20/ghc/tree/hsyl20-T16190 This new approach works very well even with TH generated string literals. The following table shows the time to compile a source that uses `file- embed` with different file sizes. I have set the threshold to 500k for the test and as the default value in the patch (hence the optimization is not triggered for the 4 first file sizes). || Size || 8.6.3 || HEAD + #16198 || HEAD + #16198 + Threshold 500K || Gain || || 128 || 2.650 || 2.331 || 2.346 || (-0.5%) || || 3K || 2.651 || 2.289 || 2.290 || (0%) || || 30K || 2.590 || 2.353 || 2.307 || (+2%) || || 100K || 2.717 || 2.379 || 2.389 || (0%) || || 500K || 3.621 || 2.814 || 2.331 || +17% || || 1M || 4.694 || 3.526 || 2.654 || +24% || || 2M || 6.784 || 4.668 || 2.650 || +21% || || 3M || 8.851 || 5.616 || 3.073 || +45% || || 30M || 63.181 || 34.318 || 8.517 || +75% || -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16190#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler