diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-02-01 23:59:42 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-02-01 23:59:42 +0000 |
commit | 801acff46281e57282a080310472dde7f92b062e (patch) | |
tree | acd5a9337ba56200d99d7b5c2b2fd5f86af95276 /clang/lib/Sema/CodeCompleteConsumer.cpp | |
parent | 0917d6e5d521946719d5df744aa70932d7ae44a2 (diff) | |
download | bcm5719-llvm-801acff46281e57282a080310472dde7f92b062e.tar.gz bcm5719-llvm-801acff46281e57282a080310472dde7f92b062e.zip |
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.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/Sema/CodeCompleteConsumer.cpp b/clang/lib/Sema/CodeCompleteConsumer.cpp index cb2dd234b48..572c8dcbd0e 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; } |