From 38f7ccdc201e3ed61a5085a9dd8eccbd375966a6 Mon Sep 17 00:00:00 2001 From: Stinkfist0 Date: Fri, 28 Sep 2018 15:00:48 +0300 Subject: [PATCH] Optimize IfcFile::entitiesByReference() by reserving capacity for IfcEntityList in advance. Around 18.4 % speed-up (avg. of first 2000 calls) when converting a somewhat large (176 MB) file to XML. --- src/ifcparse/IfcEntityList.h | 1 + src/ifcparse/IfcParse.cpp | 11 +++++------ src/ifcparse/IfcUtil.cpp | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ifcparse/IfcEntityList.h b/src/ifcparse/IfcEntityList.h index 3953a29715..d8789fee4c 100644 --- a/src/ifcparse/IfcEntityList.h +++ b/src/ifcparse/IfcEntityList.h @@ -40,6 +40,7 @@ public: it end(); IfcUtil::IfcBaseClass* operator[] (int i); unsigned int size() const; + void reserve(unsigned capacity); bool contains(IfcUtil::IfcBaseClass*) const; template typename U::list::ptr as() { diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index 83b0740bdb..20d7cb53dd 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -1793,17 +1793,16 @@ IfcEntityList::ptr IfcFile::entitiesByType(const std::string& t) { IfcEntityList::ptr IfcFile::entitiesByReference(int t) { entities_by_ref_t::const_iterator it = byref.find(t); - IfcEntityList::ptr return_value; + IfcEntityList::ptr ret; if (it != byref.end()) { + ret.reset(new IfcEntityList); + ret->reserve((unsigned)it->second.size()); const std::vector& ids = it->second; for (std::vector::const_iterator jt = ids.begin(); jt != ids.end(); ++jt) { - if (!return_value) { - return_value.reset(new IfcEntityList); - } - return_value->push(entityById(*jt)); + ret->push(entityById(*jt)); } } - return return_value; + return ret; } IfcUtil::IfcBaseClass* IfcFile::entityById(int id) { diff --git a/src/ifcparse/IfcUtil.cpp b/src/ifcparse/IfcUtil.cpp index 5c2546c5e7..fb4c48a815 100644 --- a/src/ifcparse/IfcUtil.cpp +++ b/src/ifcparse/IfcUtil.cpp @@ -48,6 +48,7 @@ void IfcEntityList::push(const IfcEntityList::ptr& l) { } } unsigned int IfcEntityList::size() const { return (unsigned int) ls.size(); } +void IfcEntityList::reserve(unsigned capacity) { ls.reserve((size_t)capacity); } IfcEntityList::it IfcEntityList::begin() { return ls.begin(); } IfcEntityList::it IfcEntityList::end() { return ls.end(); } IfcUtil::IfcBaseClass* IfcEntityList::operator[] (int i) {