From: Ben Langmuir Date: Fri, 10 Apr 2015 22:25:42 +0000 (+0000) Subject: Workaround a performance issue with modules + PCH X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f70dd98990cf548d70b8ad50d3d95a616600407f;p=clang Workaround a performance issue with modules + PCH More fallout from r228234; when looking up an identifier in a PCH that imports the Cocoa module on Darwin, it was taking 2 to 5 seconds because we were hammering the MapVector::erase() function, which is O(n). For now, just clear() the contained SmallVector to get back to 0.25 - 0.5 seconds. This is probably not the long-term fix, because without modules or without PCH the performance is more like 0.02 seconds. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234655 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 034b8a4702..d26ed222b3 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -8668,7 +8668,10 @@ void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { if (It != PendingFakeLookupResults.end()) { for (auto *ND : PendingFakeLookupResults[II]) SemaObj->IdResolver.RemoveDecl(ND); - PendingFakeLookupResults.erase(It); + // FIXME: this works around module+PCH performance issue. + // Rather than erase the result from the map, which is O(n), just clear + // the vector of NamedDecls. + It->second.clear(); } }