
#14741: High-memory usage during compilation using Template Haskell -------------------------------------+------------------------------------- Reporter: donatello | Owner: sighingnow Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | 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): Phab:D4384 Wiki Page: | -------------------------------------+------------------------------------- Changes (by sighingnow): * owner: (none) => sighingnow * failure: None/Unknown => Compile-time performance bug * differential: => Phab:D4384 Comment: After profiling, I found that the `pprASCII` function consumed the most part of memory. {{{ codeOutput HscMain compiler\main\HscMain.hs:(1349,19)-(1350,67) 1863 2 0.1 0.0 84.6 94.3 OutputAsm CodeOutput compiler\main\CodeOutput.hs:(169,37)-(171,78) 1873 2 0.2 0.0 84.6 94.3 NativeCodeGen CodeOutput compiler\main\CodeOutput.hs:171:18-78 1874 2 0.0 0.0 84.3 94.3 cmmNativeGenStream AsmCodeGen compiler\nativeGen\AsmCodeGen.hs:(342,56)-(343,50) 1875 2 0.0 0.0 84.3 94.3 cmmNativeGens AsmCodeGen compiler\nativeGen\AsmCodeGen.hs:(432,53)-(433,66) 1886 21 0.0 0.0 80.3 87.8 pprNativeCode AsmCodeGen compiler\nativeGen\AsmCodeGen.hs:(530,37)-(531,65) 1891 109 43.9 22.3 51.5 30.3 x86_pprNatCmmDecl_CmmData X86.Ppr compiler\nativeGen\X86\Ppr.hs:78:43-82 1901 0 0.1 0.0 7.5 8.0 pprDataItem' X86.Ppr compiler\nativeGen\X86\Ppr.hs:477:76-98 1910 124 0.0 0.0 0.0 0.0 pprDataItem'_vcat X86.Ppr compiler\nativeGen\X86\Ppr.hs:481:37-95 1911 124 0.0 0.0 0.0 0.0 pprData_CmmString X86.Ppr compiler\nativeGen\X86\Ppr.hs:152:36-90 1903 0 0.0 0.0 7.5 8.0 pprASCII X86.Ppr compiler\nativeGen\X86\Ppr.hs:199:28-62 1905 0 7.5 8.0 7.5 8.0 x86_pprNatCmmDecl_CmmProc X86.Ppr compiler\nativeGen\X86\Ppr.hs:(81,43)-(113,26) 1965 0 0.0 0.0 0.1 0.0 pprDataItem' X86.Ppr compiler\nativeGen\X86\Ppr.hs:477:76-98 1968 122 0.0 0.0 0.0 0.0 pprDataItem'_vcat X86.Ppr compiler\nativeGen\X86\Ppr.hs:481:37-95 1969 122 0.0 0.0 0.0 0.0 seqString AsmCodeGen compiler\nativeGen\AsmCodeGen.hs:505:33-95 1908 109 0.0 0.0 0.0 0.0 x86_pprNatCmmDecl_CmmData X86.Ppr compiler\nativeGen\X86\Ppr.hs:78:43-82 1900 85 0.0 0.0 28.6 57.3 pprData_CmmString X86.Ppr compiler\nativeGen\X86\Ppr.hs:152:36-90 1902 66 0.0 0.0 28.6 57.3 pprASCII X86.Ppr compiler\nativeGen\X86\Ppr.hs:199:28-62 1904 66 28.6 57.3 28.6 57.3 }}} The embed bytestring generates a large literal bytestring in assembly code, represented by `(CmmString [Word8])`. The `pprASCII` function will generated a list of Lit SDoc then use `hcat` to combine them. I have made some optimization to `pprASCII` in Phab:D4384, after this patch this `pprASCII` still consume the most part of memory allocation, but it can decrease the total memory allocation efficiently. Before: {{{ total time = 2.43 secs (2429 ticks @ 1000 us, 1 processor) total alloc = 4,741,422,496 bytes (excludes profiling overheads) }}} After: {{{ total time = 0.85 secs (851 ticks @ 1000 us, 1 processor) total alloc = 1,343,531,416 bytes (excludes profiling overheads) }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14741#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler