From e8b4d5fb6ffe18bcb93a86d00fbfb1ed37d0db3b Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sat, 28 May 2016 22:01:58 -0700
Subject: [PATCH] Performance boost: reduce instantiations of re.Scanner

- Lexer is the same for every Spec parser in spack, so don't build it
  every time.

- This improves time to import package.py files a lot, as a Lexer
  doesn't have to be constructed for every spc in the packages.

- To concretize dealii:
  - Before: ~20 sec
  - After:  ~6 sec
---
 lib/spack/spack/spec.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 7c09af4c21..16b61236a9 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -2015,10 +2015,13 @@ def __init__(self):
             (r'\s+', lambda scanner, val: None)])
 
 
+# Lexer is always the same for every parser.
+_lexer = SpecLexer()
+
 class SpecParser(spack.parse.Parser):
 
     def __init__(self):
-        super(SpecParser, self).__init__(SpecLexer())
+        super(SpecParser, self).__init__(_lexer)
         self.previous = None
 
     def do_parse(self):
-- 
GitLab