mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 14:23:53 +00:00
IfcFile::entitiesByReference: cache loaded references. Profiling shows around 3x speed-up (avg. of first 5000 calls to this function).
This commit is contained in:
committed by
Thomas Krijnen
parent
910cdb3754
commit
9211f80625
@@ -39,6 +39,7 @@ public:
|
|||||||
typedef boost::unordered_map<unsigned int, IfcUtil::IfcBaseClass*> entity_by_id_t;
|
typedef boost::unordered_map<unsigned int, IfcUtil::IfcBaseClass*> entity_by_id_t;
|
||||||
typedef std::map<std::string, IfcSchema::IfcRoot*> entity_by_guid_t;
|
typedef std::map<std::string, IfcSchema::IfcRoot*> entity_by_guid_t;
|
||||||
typedef std::map<unsigned int, std::vector<unsigned int> > entities_by_ref_t;
|
typedef std::map<unsigned int, std::vector<unsigned int> > entities_by_ref_t;
|
||||||
|
typedef std::map<unsigned int, IfcEntityList::ptr> ref_map_t;
|
||||||
typedef entity_by_id_t::const_iterator const_iterator;
|
typedef entity_by_id_t::const_iterator const_iterator;
|
||||||
|
|
||||||
class type_iterator : private entities_by_type_t::const_iterator {
|
class type_iterator : private entities_by_type_t::const_iterator {
|
||||||
@@ -77,6 +78,7 @@ private:
|
|||||||
entities_by_type_t bytype;
|
entities_by_type_t bytype;
|
||||||
entities_by_type_t bytype_excl;
|
entities_by_type_t bytype_excl;
|
||||||
entities_by_ref_t byref;
|
entities_by_ref_t byref;
|
||||||
|
ref_map_t by_ref_cached_;
|
||||||
entity_by_guid_t byguid;
|
entity_by_guid_t byguid;
|
||||||
entity_entity_map_t entity_file_map;
|
entity_entity_map_t entity_file_map;
|
||||||
|
|
||||||
|
|||||||
@@ -1795,12 +1795,19 @@ IfcEntityList::ptr IfcFile::entitiesByReference(int t) {
|
|||||||
entities_by_ref_t::const_iterator it = byref.find(t);
|
entities_by_ref_t::const_iterator it = byref.find(t);
|
||||||
IfcEntityList::ptr ret;
|
IfcEntityList::ptr ret;
|
||||||
if (it != byref.end()) {
|
if (it != byref.end()) {
|
||||||
ret.reset(new IfcEntityList);
|
ref_map_t::const_iterator cached_it = by_ref_cached_.find(t);
|
||||||
ret->reserve((unsigned)it->second.size());
|
if (cached_it != by_ref_cached_.end()) {
|
||||||
const std::vector<unsigned>& ids = it->second;
|
ret = cached_it->second;
|
||||||
for (std::vector<unsigned>::const_iterator jt = ids.begin(); jt != ids.end(); ++jt) {
|
}
|
||||||
ret->push(entityById(*jt));
|
else {
|
||||||
}
|
ret.reset(new IfcEntityList);
|
||||||
|
ret->reserve((unsigned)it->second.size());
|
||||||
|
const std::vector<unsigned>& ids = it->second;
|
||||||
|
for (std::vector<unsigned>::const_iterator jt = ids.begin(); jt != ids.end(); ++jt) {
|
||||||
|
ret->push(entityById(*jt));
|
||||||
|
}
|
||||||
|
by_ref_cached_[t] = ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user