diff options
| author | Matt Spinler <spinler@us.ibm.com> | 2018-05-31 13:12:39 -0500 |
|---|---|---|
| committer | Matt Spinler <spinler@us.ibm.com> | 2018-06-04 10:18:54 -0500 |
| commit | b6593863280280f7e1f623b5f76fdf2f7ff6b621 (patch) | |
| tree | 622f4947ca82d56c7cc22003e4c7bc7d954ed099 | |
| parent | 167e2379abb36d8c813fed0ee1da3b79715d477a (diff) | |
| download | phosphor-objmgr-b6593863280280f7e1f623b5f76fdf2f7ff6b621.tar.gz phosphor-objmgr-b6593863280280f7e1f623b5f76fdf2f7ff6b621.zip | |
Speed up enumerate_subtree()
Searching a set is faster than searching a list, and changing this
particular spot to a set cut the function's overall execution time
by half when enumerating 200 /xyz/openbmc_project/logging objects,
from ~15s down to about 6 (with system power off).
Also removed the list() conversions that tend to be slow and aren't
really needed for python3 anyway.
Resolves openbmc/openbmc#3199
Change-Id: Id4534b7c3aee1017164f6d01e9028a8bcf0e9cd2
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
| -rw-r--r-- | obmc/mapper/bindings.py | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/obmc/mapper/bindings.py b/obmc/mapper/bindings.py index f5f96d0..8fbcd51 100644 --- a/obmc/mapper/bindings.py +++ b/obmc/mapper/bindings.py @@ -122,7 +122,7 @@ class Mapper: obj = {} - for owner, interfaces in list(mapper_data[path].items()): + for owner, interfaces in mapper_data[path].items(): obj.update( self.__get_properties_on_bus( path, owner, interfaces, match)) @@ -140,8 +140,8 @@ class Mapper: # look for objectmanager implementations as they result # in fewer dbus calls - for path, bus_data in list(mapper_data.items()): - for owner, interfaces in list(bus_data.items()): + for path, bus_data in mapper_data.items(): + for owner, interfaces in bus_data.items(): owners.append(owner) if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces: managers[owner] = path @@ -156,14 +156,16 @@ class Mapper: if e.get_dbus_name() != MAPPER_NOT_FOUND: raise - for path, bus_data in list(ancestors.items()): - for owner, interfaces in list(bus_data.items()): + for path, bus_data in ancestors.items(): + for owner, interfaces in bus_data.items(): if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces: managers[owner] = path + mapper_keys = set(mapper_data.keys()) + # make all the manager gmo (get managed objects) calls results = {} - for owner, path in list(managers.items()): + for owner, path in managers.items(): if owner not in owners: continue obj = self.bus.get_object(owner, path, introspect=False) @@ -172,17 +174,17 @@ class Mapper: # flatten (remove interface names) gmo results for path, interfaces in \ - list(iface.GetManagedObjects().items()): - if path not in iter(list(mapper_data.keys())): + iface.GetManagedObjects().items(): + if path not in mapper_keys: continue properties = {} - for iface, props in list(interfaces.items()): + for iface, props in interfaces.items(): properties.update(props) results.setdefault(path, {}).setdefault(owner, properties) # make dbus calls for any remaining objects - for path, bus_data in list(mapper_data.items()): - for owner, interfaces in list(bus_data.items()): + for path, bus_data in mapper_data.items(): + for owner, interfaces in bus_data.items(): if results.setdefault(path, {}).setdefault(owner, {}): continue results[path][owner].update( @@ -190,8 +192,8 @@ class Mapper: path, owner, interfaces, match)) objs = obmc.utils.pathtree.PathTree() - for path, owners in list(results.items()): - for owner, properties in list(owners.items()): + for path, owners in results.items(): + for owner, properties in owners.items(): objs.setdefault(path, {}).update(properties) return objs |

