Avoid linear lookup in unload_wkr in the Linker
authorBartosz Nitka <bnitka@fb.com>
Fri, 21 Jul 2017 18:41:41 +0000 (11:41 -0700)
committerBartosz Nitka <niteria@gmail.com>
Sat, 22 Jul 2017 14:19:21 +0000 (07:19 -0700)
I've encountered an issue with following
reproduction steps:
* `:load` a large number of modules (~2000)
* compile a BCO that depends on many other BCOs from many other modules
* `:reload`
* try to compile anything, even `1` works

Before this patch the last step takes ~5s.
It takes 80ms after.

Test Plan: harbormaster

Reviewers: simonmar, austin, hvr, bgamari

Subscribers: rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3770

compiler/ghci/Linker.hs

index f326590..aee7684 100644 (file)
@@ -1091,13 +1091,13 @@ unload_wkr hsc_env keep_linkables pls = do
                    filter (not . null . linkableObjs) bcos_to_unload))) $
     purgeLookupSymbolCache hsc_env
 
-  let bcos_retained = map linkableModule remaining_bcos_loaded
+  let bcos_retained = mkModuleSet $ map linkableModule remaining_bcos_loaded
 
       -- Note that we want to remove all *local*
       -- (i.e. non-isExternal) names too (these are the
       -- temporary bindings from the command line).
       keep_name (n,_) = isExternalName n &&
-                        nameModule n `elem` bcos_retained
+                        nameModule n `elemModuleSet` bcos_retained
 
       itbl_env'     = filterNameEnv keep_name (itbl_env pls)
       closure_env'  = filterNameEnv keep_name (closure_env pls)