[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
This commit is contained in:
Alexandre Ganea 2021-01-13 14:34:43 -05:00
parent 3bd620d450
commit e7a371f9fd
1 changed files with 20 additions and 0 deletions

View File

@ -679,6 +679,26 @@ void TpiSource::mergeUniqueTypeRecords(ArrayRef<uint8_t> 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) {