diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-12-03 12:10:05 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-12-03 17:45:53 +0000 |
commit | eba506b301b3be7953a64b486c231b0e7c7c1de3 (patch) | |
tree | a22806e194598e9c16d78dfc92daadd0017d0be3 /bitbake/lib/bb/data_smart.py | |
parent | b4b1c90bcfe4b3baddabd5bfcea9a264be223908 (diff) | |
download | poky-eba506b301b3be7953a64b486c231b0e7c7c1de3.tar.gz |
bitbake: codeparser/data_smart: Optimise parsing speed
The previous "contains" changes caused a ~3% parsing speed impact.
Looking at the cause of those changes was interesting:
* Use of defaultdict was slower than just checking for missing entries
and setting them when needed.
* Even the "import collections" adversely affects parsing speed
* There was a missing intern function for the contains cache data
* Setting up a log object for each variable has noticeable overhead
due to the changes in the code paths uses, we can avoid this.
* We can call getVarFlag on "_content" directly within VariableParse
for a noticeable speed gain since its a seriously hot code path.
This patch therefore tweaks the code based on the above observations to
get some of the speed back.
(Bitbake rev: fca802187a2a30686a8a07d2b6b16a3e5716e293)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/data_smart.py')
-rw-r--r-- | bitbake/lib/bb/data_smart.py | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index 9a6f767116..833d9f17a4 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py | |||
@@ -35,7 +35,6 @@ import hashlib | |||
35 | import bb, bb.codeparser | 35 | import bb, bb.codeparser |
36 | from bb import utils | 36 | from bb import utils |
37 | from bb.COW import COWDictBase | 37 | from bb.COW import COWDictBase |
38 | import collections | ||
39 | 38 | ||
40 | logger = logging.getLogger("BitBake.Data") | 39 | logger = logging.getLogger("BitBake.Data") |
41 | 40 | ||
@@ -89,7 +88,7 @@ class VariableParse: | |||
89 | 88 | ||
90 | self.references = set() | 89 | self.references = set() |
91 | self.execs = set() | 90 | self.execs = set() |
92 | self.contains = collections.defaultdict(set) | 91 | self.contains = {} |
93 | 92 | ||
94 | def var_sub(self, match): | 93 | def var_sub(self, match): |
95 | key = match.group()[2:-1] | 94 | key = match.group()[2:-1] |
@@ -100,7 +99,7 @@ class VariableParse: | |||
100 | varparse = self.d.expand_cache[key] | 99 | varparse = self.d.expand_cache[key] |
101 | var = varparse.value | 100 | var = varparse.value |
102 | else: | 101 | else: |
103 | var = self.d.getVar(key, True) | 102 | var = self.d.getVarFlag(key, "_content", True) |
104 | self.references.add(key) | 103 | self.references.add(key) |
105 | if var is not None: | 104 | if var is not None: |
106 | return var | 105 | return var |
@@ -123,7 +122,10 @@ class VariableParse: | |||
123 | self.execs |= parser.execs | 122 | self.execs |= parser.execs |
124 | 123 | ||
125 | for k in parser.contains: | 124 | for k in parser.contains: |
126 | self.contains[k].update(parser.contains[k]) | 125 | if k not in self.contains: |
126 | self.contains[k] = parser.contains[k] | ||
127 | else: | ||
128 | self.contains[k].update(parser.contains[k]) | ||
127 | value = utils.better_eval(codeobj, DataContext(self.d)) | 129 | value = utils.better_eval(codeobj, DataContext(self.d)) |
128 | return str(value) | 130 | return str(value) |
129 | 131 | ||