aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/CodeCompleteConsumer.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-02-01 23:59:42 +0000
committerDouglas Gregor <dgregor@apple.com>2011-02-01 23:59:42 +0000
commit801acff46281e57282a080310472dde7f92b062e (patch)
treeacd5a9337ba56200d99d7b5c2b2fd5f86af95276 /clang/lib/Sema/CodeCompleteConsumer.cpp
parent0917d6e5d521946719d5df744aa70932d7ae44a2 (diff)
downloadllvm-801acff46281e57282a080310472dde7f92b062e.zip
llvm-801acff46281e57282a080310472dde7f92b062e.tar.gz
llvm-801acff46281e57282a080310472dde7f92b062e.tar.bz2
Unique code-completion strings. On Cocoa.h, this costs us about 4% in
speed but saves us about 25% of the memory usage for strings. llvm-svn: 124704
Diffstat (limited to 'clang/lib/Sema/CodeCompleteConsumer.cpp')
-rw-r--r--clang/lib/Sema/CodeCompleteConsumer.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/Sema/CodeCompleteConsumer.cpp b/clang/lib/Sema/CodeCompleteConsumer.cpp
index cb2dd23..572c8dc 100644
--- a/clang/lib/Sema/CodeCompleteConsumer.cpp
+++ b/clang/lib/Sema/CodeCompleteConsumer.cpp
@@ -220,10 +220,41 @@ const char *CodeCompletionString::getTypedText() const {
return 0;
}
+CodeCompletionAllocator::CodeCompletionAllocator()
+ : llvm::BumpPtrAllocator(), StringBytesAllocated(0), StringBytesUniqued(0),
+ StringsAllocated(0), StringsUniqued(0)
+{
+}
+
+CodeCompletionAllocator::~CodeCompletionAllocator() { }
+
+void CodeCompletionAllocator::PrintStats() {
+ llvm::errs() << "---Code completion memory allocation---\n"
+ << "String bytes uniqued: " << StringBytesUniqued << "/"
+ << StringBytesAllocated << " ("
+ << ((float)StringBytesUniqued*100/StringBytesAllocated)
+ << ")\nStrings uniqued: " << StringsUniqued << "/" << StringsAllocated
+ << " (" << ((float)StringsUniqued*100/StringsAllocated)
+ << ")\n";
+
+ llvm::BumpPtrAllocator::PrintStats();
+}
+
const char *CodeCompletionAllocator::CopyString(llvm::StringRef String) {
+ llvm::DenseSet<llvm::StringRef, DenseMapStringRefInfo>::iterator Uniqued
+ = UniqueStrings.find(String);
+ ++StringsAllocated;
+ StringBytesAllocated += String.size() + 1;
+ if (Uniqued != UniqueStrings.end()) {
+ StringBytesUniqued += String.size() + 1;
+ ++StringsUniqued;
+ return Uniqued->data();
+ }
+
char *Mem = (char *)Allocate(String.size() + 1, 1);
std::copy(String.begin(), String.end(), Mem);
Mem[String.size()] = 0;
+ UniqueStrings.insert(llvm::StringRef(Mem, String.size()));
return Mem;
}