[PATCH] D81342: [Support] FoldingSetNodeID::AddString(): reserve memory

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 7 08:29:20 PDT 2020


lebedev.ri created this revision.
lebedev.ri added reviewers: efriedma, nikic, bkramer.
lebedev.ri added a project: LLVM.
Herald added a subscriber: hiraditya.
lebedev.ri edited the summary of this revision.

It is traditionally potentially very inefficient to not preallocate the memory,
but rely on reallocation every time you push something into vector.

For example, looking at unity build of RawSpeed
(`-O3 -g0 -emit-llvm -Xclang -disable-llvm-optzns`),
the memory story is as follows:

  total runtime: 11.34s.
  calls to allocation functions: 2694053 (237612/s)
  temporary memory allocations: 645188 (56904/s)
  peak heap memory consumption: 231.36MB
  peak RSS (including heaptrack overhead): 397.39MB

Looking at details, `FoldingSetNodeID::AddString()` is noteworthy, frequently called and is allocation-heavy.

But it is quite obvious how many times we will push into `Bits` - we will push `String.size()` itself,
and then we will push once per every 4 bytes of `String` (padding last block).

And if we preallocate, we get:

  total runtime: 11.20s.
  calls to allocation functions: 2594704 (231669/s)
  temporary memory allocations: 560004 (50000/s)
  peak heap memory consumption: 231.36MB
  peak RSS (including heaptrack overhead): 398.06MB

Which is a measurable win:

  total runtime: -0.14s.                             #  -1.23 %
  calls to allocation functions: -99349 (719920/s)   #  -3.69 %
  temporary memory allocations: -85184 (617275/s)    # -13.2 % (!)
  peak heap memory consumption: 0B
  peak RSS (including heaptrack overhead): 0B
  total memory leaked: 0B


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D81342

Files:
  llvm/lib/Support/FoldingSet.cpp


Index: llvm/lib/Support/FoldingSet.cpp
===================================================================
--- llvm/lib/Support/FoldingSet.cpp
+++ llvm/lib/Support/FoldingSet.cpp
@@ -86,6 +86,10 @@
 
 void FoldingSetNodeID::AddString(StringRef String) {
   unsigned Size =  String.size();
+
+  unsigned NumInserts = 1 + ((Size + 4 - 1) / 4); // 1 + ┌Size / 4┐
+  Bits.reserve(Bits.size() + NumInserts);
+
   Bits.push_back(Size);
   if (!Size) return;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81342.269059.patch
Type: text/x-patch
Size: 458 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200607/c8822c6e/attachment.bin>


More information about the llvm-commits mailing list