git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
[psc-ide] Speeds up rebuilding by x2

This puts the second rebuild, which is used to make private members of modules available during completion on a separate thread and thus halves the time spent rebuilding.

commita518d56189c46a6c5ec034c5f930d1630ceadb19 authorChristoph Hegemann <christoph.hegemann1337@gmail.com> dateSun 22 Jan 2017, 17:16 (10 years ago) parentbb79420
2 files changed+13−5
src/Language/PureScript/Ide/Logging.hs+4 src/Language/PureScript/Ide/Rebuild.hs+9−5
src/Language/PureScript/Ide/Logging.hs+4
@@ -4,6 +4,7 @@ module Language.PureScript.Ide.Logging
44 ( runLogger
55 , logPerf
66 , displayTimeSpec
7+ , labelTimespec
78 ) where
89
910import Protolude
@@ -24,6 +25,9 @@ runLogger logLevel' =
2425 LogDebug -> not (logLevel == LevelOther "perf")
2526 LogPerf -> logLevel == LevelOther "perf")
2627
28+labelTimespec :: Text -> TimeSpec -> Text
29+labelTimespec label duration = label <> ": " <> displayTimeSpec duration
30+
2731logPerf :: (MonadIO m, MonadLogger m) => (TimeSpec -> Text) -> m t -> m t
2832logPerf format f = do
2933 start <- liftIO (getTime Monotonic)
src/Language/PureScript/Ide/Rebuild.hs+9−5
@@ -15,6 +15,7 @@ import qualified Data.Set as S
1515import qualified Language.PureScript as P
1616import Language.PureScript.Errors.JSON
1717import Language.PureScript.Ide.Error
18+import Language.PureScript.Ide.Logging
1819import Language.PureScript.Ide.State
1920import Language.PureScript.Ide.Types
2021import System.IO.UTF8 (readUTF8FileT)
@@ -51,7 +52,7 @@ rebuildFile path = do
5152
5253 -- Externs files must be sorted ahead of time, so that they get applied
5354 -- correctly to the 'Environment'.
54− externs <- sortExterns m =<< getExternFiles
55+ externs <- logPerf (labelTimespec "Sorting externs") (sortExterns m =<< getExternFiles)
5556
5657 outputDirectory <- confOutputPath . ideConfiguration <$> ask
5758
@@ -62,25 +63,28 @@ rebuildFile path = do
6263
6364 let makeEnv = MakeActionsEnv outputDirectory filePathMap foreigns False
6465 -- Rebuild the single module using the cached externs
65− (result, warnings) <- liftIO
66+ (result, warnings) <- logPerf (labelTimespec "Rebuilding Module") $
67+ liftIO
6668 . P.runMake P.defaultOptions
6769 . P.rebuildModule (buildMakeActions
6870 >>= shushProgress $ makeEnv) externs $ m
6971 case result of
7072 Left errors -> throwError (RebuildError (toJSONErrors False P.Error errors))
7173 Right _ -> do
72− rebuildModuleOpen makeEnv externs m
74+ env <- ask
75+ let ll = confLogLevel (ideConfiguration env)
76+ _ <- liftIO (async (runLogger ll (runReaderT (rebuildModuleOpen makeEnv externs m) env)))
7377 pure (RebuildSuccess (toJSONErrors False P.Warning warnings))
7478
7579-- | Rebuilds a module but opens up its export list first and stores the result
7680-- inside the rebuild cache
7781rebuildModuleOpen
78− :: (Ide m, MonadLogger m, MonadError PscIdeError m)
82+ :: (Ide m, MonadLogger m)
7983 => MakeActionsEnv
8084 -> [P.ExternsFile]
8185 -> P.Module
8286 -> m ()
83−rebuildModuleOpen makeEnv externs m = do
87+rebuildModuleOpen makeEnv externs m = void $ runExceptT $ do
8488 (openResult, _) <- liftIO
8589 . P.runMake P.defaultOptions
8690 . P.rebuildModule (buildMakeActions