@@ -215,6 +215,7 @@ parseArgs = do
215215
216216type BuildState =
217217 { currentStartTime :: Ref (Maybe Instant)
218+ , codegenStartTime :: Ref (Maybe Instant)
218219 , startTime :: Instant
219220 , steps :: Ref (Array (Tuple ModuleName OptimizationSteps))
220221 , timings :: Ref (Map ModuleName Milliseconds)
@@ -238,9 +239,10 @@ main cliRoot =
238239 makeBuildState = do
239240 startTime <- now
240241 currentStartTime <- Ref.new Nothing
242+ codegenStartTime <- Ref.new Nothing
241243 steps <- Ref.new []
242244 timings <- Ref.new Map.empty
243− pure { currentStartTime, startTime, steps, timings }
245+ pure { currentStartTime, codegenStartTime, startTime, steps, timings }
244246
245247 buildCmd :: BuildArgs -> Aff Unit
246248 buildCmd args = liftEffect makeBuildState >>= \state -> basicBuildMain
@@ -248,6 +250,7 @@ main cliRoot =
248250 , resolveExternalDirectives: map (fromMaybe Map.empty) $ traverse externalDirectivesFromFile args.directivesFile
249251 , foreignSemantics: Map.union coreForeignSemantics esForeignSemantics
250252 , onCodegenBefore: do
253+ liftEffect $ flip Ref.write state.codegenStartTime <<< Just =<< now
251254 mkdirp args.outputDir
252255 writeTextFile UTF8 (Path.concat [ args.outputDir, "package.json" ]) esModulePackageJson
253256 copyFile (Path.concat [ cliRoot, "runtime.js" ]) (Path.concat [ args.outputDir, "runtime.js" ])
@@ -255,11 +258,17 @@ main cliRoot =
255258 allSteps <- liftEffect (Ref.read state.steps)
256259 when args.printTiming do
257260 endTime <- liftEffect now
261+ codegenStartTime <- fromMaybe state.startTime <$> liftEffect (Ref.read state.codegenStartTime)
258262 timings <- Array.sortBy (comparing (Down <<< snd)) <<< Map.toUnfoldable <$> liftEffect (Ref.read state.timings)
259263 let topTimings = Array.take 20 timings
260264 Console.log $ "\nTop " <> show (Array.length topTimings) <> " slowest modules:"
261265 Console.log $ printTimings topTimings
262− Console.log $ "\nTotal build time: " <> formatMs (timeDiff state.startTime endTime)
266+ Console.log ""
267+ Console.log $ printTotals
268+ [ Tuple "Parse time" (timeDiff state.startTime codegenStartTime)
269+ , Tuple "Build time" (timeDiff codegenStartTime endTime)
270+ , Tuple "Total time" (timeDiff state.startTime endTime)
271+ ]
263272 unless (Array.null allSteps) do
264273 let allDoc = Dodo.foldWithSeparator (Dodo.break <> Dodo.break) $ uncurry printModuleSteps <$> allSteps
265274 FS.writeTextFile UTF8 "optimization-traces.txt" $ Dodo.print Dodo.plainText Dodo.twoSpaces allDoc
@@ -382,10 +391,23 @@ formatMs :: Milliseconds -> String
382391formatMs (Milliseconds m) = Number.toString m <> "ms"
383392
384393printTimings :: Array (Tuple ModuleName Milliseconds) -> String
385−printTimings all = Dodo.print Dodo.plainText Dodo.twoSpaces $ Dodo.indent $ Dodo.Box.toDoc table
394+printTimings =
395+ Dodo.print Dodo.plainText Dodo.twoSpaces
396+ <<< Dodo.indent
397+ <<< printTable
398+ <<< map (bimap (Dodo.text <<< append "* " <<< unwrap) (Dodo.text <<< formatMs))
399+
400+printTotals :: Array (Tuple String Milliseconds) -> String
401+printTotals =
402+ Dodo.print Dodo.plainText Dodo.twoSpaces
403+ <<< printTable
404+ <<< map (bimap Dodo.text (Dodo.text <<< formatMs))
405+
406+printTable :: forall a. Array (Tuple (Dodo.Doc a) (Dodo.Doc a)) -> Dodo.Doc a
407+printTable all = Dodo.Box.toDoc table
386408 where
387409 toBox = Dodo.print Dodo.Box.docBox Dodo.twoSpaces
388− columns = bimap (toBox <<< Dodo.text <<< append "* " <<< unwrap) (toBox <<< Dodo.text <<< formatMs) <$> all
410+ columns = bimap toBox toBox <$> all
389411 col1Width = fromMaybe 0 $ Array.last $ Array.sort $ (_.width <<< Dodo.Box.sizeOf <<< fst) <$> columns
390412 col2Width = fromMaybe 0 $ Array.last $ Array.sort $ (_.width <<< Dodo.Box.sizeOf <<< snd) <$> columns
391413 table = Dodo.Box.vertical $ printRow <$> columns