From a93a6136682debfd58d295e3035ad2c6d142bda1 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 2 Dec 2019 23:05:02 +0100 Subject: Speedup environment activation (#13557) * Add a transaction around repeated calls to `spec.prefix` in the activation process * cache the computation of home in the python package to speed up setting deps * ensure that module-scope variables are only set *once* per module --- lib/spack/spack/build_environment.py | 9 +++++++++ lib/spack/spack/environment.py | 6 ++++-- var/spack/repos/builtin/packages/python/package.py | 10 ++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 84fc58587e..13ee99d177 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -422,6 +422,11 @@ def set_build_environment_variables(pkg, env, dirty): def _set_variables_for_single_module(pkg, module): """Helper function to set module variables for single module.""" + # Put a marker on this module so that it won't execute the body of this + # function again, since it is not needed + marker = '_set_run_already_called' + if getattr(module, marker, False): + return jobs = spack.config.get('config:build_jobs') if pkg.parallel else 1 jobs = min(jobs, multiprocessing.cpu_count()) @@ -489,6 +494,10 @@ def _set_variables_for_single_module(pkg, module): m.static_to_shared_library = static_to_shared_library + # Put a marker on this module so that it won't execute the body of this + # function again, since it is not needed + setattr(m, marker, True) + def set_module_variables_for_package(pkg): """Populate the module scope of install() with some useful functions. diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index 55d513ee27..2c7a0cf098 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -159,7 +159,8 @@ def activate( cmds += 'export PS1="%s ${PS1}";\n' % prompt if add_view and default_view_name in env.views: - cmds += env.add_default_view_to_shell(shell) + with spack.store.db.read_transaction(): + cmds += env.add_default_view_to_shell(shell) return cmds @@ -207,7 +208,8 @@ def deactivate(shell='sh'): cmds += 'fi;\n' if default_view_name in _active_environment.views: - cmds += _active_environment.rm_default_view_from_shell(shell) + with spack.store.db.read_transaction(): + cmds += _active_environment.rm_default_view_from_shell(shell) tty.debug("Deactivated environmennt '%s'" % _active_environment.name) _active_environment = None diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index 15901872e9..a92d1c6c79 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -163,6 +163,9 @@ class Python(AutotoolsPackage): _DISTUTIL_CACHE_FILENAME = 'sysconfig.json' _distutil_vars = None + # Used to cache home locations, since computing them might be expensive + _homes = {} + # An in-source build with --enable-optimizations fails for python@3.X build_directory = 'spack-build' @@ -622,8 +625,11 @@ class Python(AutotoolsPackage): ``packages.yaml`` unknowingly. Query the python executable to determine exactly where it is installed.""" - prefix = self.get_config_var('prefix') - return Prefix(prefix) + dag_hash = self.spec.dag_hash() + if dag_hash not in self._homes: + prefix = self.get_config_var('prefix') + self._homes[dag_hash] = Prefix(prefix) + return self._homes[dag_hash] @property def libs(self): -- cgit v1.2.3-70-g09d2