From ee9b153efbd01dac82b37ecc3668f01a99bfba4f Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Fri, 28 Jun 2013 21:24:42 +0000 Subject: [PATCH] Improve performance of reading species info from XML Avoid an O(N) lookup for the thermo info for each species. Using an unordered_map would be even better, but there's no portable way to do that without Boost. --- src/thermo/ThermoFactory.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/thermo/ThermoFactory.cpp b/src/thermo/ThermoFactory.cpp index 4dcb3b310..4cc46ea3d 100644 --- a/src/thermo/ThermoFactory.cpp +++ b/src/thermo/ThermoFactory.cpp @@ -353,6 +353,11 @@ static void formSpeciesXMLNodeList(std::vector &spDataNodeList, } } } else { + std::map speciesNodes; + for (size_t k = 0; k < db->nChildren(); k++) { + XML_Node& child = db->child(k); + speciesNodes[child["name"]] = &child; + } for (size_t k = 0; k < nsp; k++) { string stemp = spnames[k]; skip = false; @@ -367,11 +372,12 @@ static void formSpeciesXMLNodeList(std::vector &spDataNodeList, if (!skip) { declared[stemp] = true; // Find the species in the database by name. - XML_Node* s = db->findByAttr("name", stemp); - if (!s) { + std::map::iterator iter = speciesNodes.find(stemp); + if (iter == speciesNodes.end()) { throw CanteraError("importPhase","no data for species, \"" + stemp + "\""); } + XML_Node* s = iter->second; nSpecies++; spNamesList.resize(nSpecies); spDataNodeList.resize(nSpecies, 0);