From e7a371f9fd0076c187f4cd1a9c7546867faeb19b Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Wed, 13 Jan 2021 14:34:43 -0500 Subject: [PATCH] [LLD][COFF] Avoid std::vector resizes during type merging Consistently saves approx. 0.6 sec (out of 18 sec) on a large output (400 MB EXE, 2 GB PDB). Differential Revision: https://reviews.llvm.org/D94555 --- lld/COFF/DebugTypes.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lld/COFF/DebugTypes.cpp b/lld/COFF/DebugTypes.cpp index 52c24aaf214f..fedcb054540f 100644 --- a/lld/COFF/DebugTypes.cpp +++ b/lld/COFF/DebugTypes.cpp @@ -679,6 +679,26 @@ void TpiSource::mergeUniqueTypeRecords(ArrayRef typeRecords, auto nextUniqueIndex = uniqueTypes.begin(); assert(mergedTpi.recs.empty()); assert(mergedIpi.recs.empty()); + + // Pre-compute the number of elements in advance to avoid std::vector resizes. + unsigned nbTpiRecs = 0; + unsigned nbIpiRecs = 0; + forEachTypeChecked(typeRecords, [&](const CVType &ty) { + if (nextUniqueIndex != uniqueTypes.end() && + *nextUniqueIndex == ghashIndex) { + assert(ty.length() <= codeview::MaxRecordLength); + size_t newSize = alignTo(ty.length(), 4); + (isIdRecord(ty.kind()) ? nbIpiRecs : nbTpiRecs) += newSize; + ++nextUniqueIndex; + } + ++ghashIndex; + }); + mergedTpi.recs.reserve(nbTpiRecs); + mergedIpi.recs.reserve(nbIpiRecs); + + // Do the actual type merge. + ghashIndex = 0; + nextUniqueIndex = uniqueTypes.begin(); forEachTypeChecked(typeRecords, [&](const CVType &ty) { if (nextUniqueIndex != uniqueTypes.end() && *nextUniqueIndex == ghashIndex) {