[clang-tools-extra] 2efccf5 - [clangd][NFC] Reduce memory usage while building dex
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 22 08:45:14 PDT 2022
Author: Kadir Cetinkaya
Date: 2022-04-22T17:44:47+02:00
New Revision: 2efccf5166f4dd7d188eea2de4f4b7f50b64e477
URL: https://github.com/llvm/llvm-project/commit/2efccf5166f4dd7d188eea2de4f4b7f50b64e477
DIFF: https://github.com/llvm/llvm-project/commit/2efccf5166f4dd7d188eea2de4f4b7f50b64e477.diff
LOG: [clangd][NFC] Reduce memory usage while building dex
Reduce peak memory usage by tearing down the intermediate representation
as we build the final one. Rather than deleting it in the end.
Differential Revision: https://reviews.llvm.org/D124240
Added:
Modified:
clang-tools-extra/clangd/index/dex/Dex.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/index/dex/Dex.cpp b/clang-tools-extra/clangd/index/dex/Dex.cpp
index 5829d780c6072..18779077b2c43 100644
--- a/clang-tools-extra/clangd/index/dex/Dex.cpp
+++ b/clang-tools-extra/clangd/index/dex/Dex.cpp
@@ -13,14 +13,19 @@
#include "URI.h"
#include "index/Index.h"
#include "index/dex/Iterator.h"
+#include "index/dex/Token.h"
#include "index/dex/Trigram.h"
#include "support/Logger.h"
#include "support/Trace.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/ScopedPrinter.h"
#include <algorithm>
#include <queue>
+#include <utility>
+#include <vector>
namespace clang {
namespace clangd {
@@ -76,23 +81,38 @@ class IndexBuilder {
}
// Assemble the final compressed posting lists for the added symbols.
- llvm::DenseMap<Token, PostingList> build() {
+ llvm::DenseMap<Token, PostingList> build() && {
llvm::DenseMap<Token, PostingList> Result(/*InitialReserve=*/
TrigramDocs.size() +
RestrictedCCDocs.size() +
TypeDocs.size() +
ScopeDocs.size() +
ProximityDocs.size());
- for (const auto &E : TrigramDocs)
+ // Tear down intermediate structs as we go to reduce memory usage.
+ // Since we're trying to get rid of underlying allocations, clearing the
+ // containers is not enough.
+ auto CreatePostingList =
+ [&Result](Token::Kind TK, llvm::StringMap<std::vector<DocID>> &Docs) {
+ for (auto &E : Docs) {
+ Result.try_emplace(Token(TK, E.first()), E.second);
+ E.second = {};
+ }
+ Docs = {};
+ };
+ CreatePostingList(Token::Kind::Type, TypeDocs);
+ CreatePostingList(Token::Kind::Scope, ScopeDocs);
+ CreatePostingList(Token::Kind::ProximityURI, ProximityDocs);
+
+ // TrigramDocs are stored in a DenseMap and RestrictedCCDocs is not even a
+ // map, treat them specially.
+ for (auto &E : TrigramDocs) {
Result.try_emplace(Token(Token::Kind::Trigram, E.first.str()), E.second);
- for (const auto &E : TypeDocs)
- Result.try_emplace(Token(Token::Kind::Type, E.first()), E.second);
- for (const auto &E : ScopeDocs)
- Result.try_emplace(Token(Token::Kind::Scope, E.first()), E.second);
- for (const auto &E : ProximityDocs)
- Result.try_emplace(Token(Token::Kind::ProximityURI, E.first()), E.second);
+ E.second = {};
+ }
+ TrigramDocs = llvm::DenseMap<Trigram, std::vector<DocID>>{};
if (!RestrictedCCDocs.empty())
- Result.try_emplace(RestrictedForCodeCompletion, RestrictedCCDocs);
+ Result.try_emplace(RestrictedForCodeCompletion,
+ std::move(RestrictedCCDocs));
return Result;
}
};
@@ -125,7 +145,7 @@ void Dex::buildIndex() {
IndexBuilder Builder;
for (DocID SymbolRank = 0; SymbolRank < Symbols.size(); ++SymbolRank)
Builder.add(*Symbols[SymbolRank], SymbolRank);
- InvertedIndex = Builder.build();
+ InvertedIndex = std::move(Builder).build();
}
std::unique_ptr<Iterator> Dex::iterator(const Token &Tok) const {
More information about the cfe-commits
mailing list