bulbazord added a comment.
Ok, I'm back with actual data on this patch. I have a test ObjC app with some
UI, it loads a couple hundred modules. I place a breakpoint on main, I run
until we hit main, and then I continue. My app will stop at `-[NSBlockOperation
main]` after loading all the required modules. Here is the data without this
patch applied:
% hyperfine -w 3 -- "$lldb -x -b -o 'b main' -o 'r' -o 'c' $App"
Benchmark 1: $lldb -x -b -o 'b main' -o 'r' -o 'c' $App
Time (mean ± σ): 6.367 s ± 0.037 s [User: 5.688 s, System: 0.295 s]
Range (min … max): 6.312 s … 6.417 s 10 runs
...
"memory": {
"strings": {
"bytesTotal": 133180053,
"bytesUnused": 52050681,
"bytesUsed": 81129372
}
},
Now, with the patch applied:
% hyperfine -w 3 -- "$lldb -x -b -o 'b main' -o 'r' -o 'c' $App"
Benchmark 1: $lldb -x -b -o 'b main' -o 'r' -o 'c' $App
Time (mean ± σ): 6.209 s ± 0.046 s [User: 5.554 s, System: 0.282 s]
Range (min … max): 6.159 s … 6.295 s 10 runs
...
"memory": {
"strings": {
"bytesTotal": 133175645,
"bytesUnused": 52115081,
"bytesUsed": 81060564
}
},
From this we can see that my patch actually is _slightly_ faster, saving a
little more than 100ms on average. I ran hyperfine a few times under the same
conditions and this is quite repeatable.
As for memory consumption, the ConstString StringPool is slightly smaller. The
amount of bytes actually used in the StringPool shrank by about 60kb, and the
total size of the StringPool shrank by about 5kb -- meaning we stored a lot
less strings and grew the StringPool slightly less than before.
Now we had some discussion about `ObjCLanguage::MethodName` using a
`ConstString` instead of a `std::string` to back its `m_full` member. I
gathered the numbers on that one too:
% hyperfine -w 3 -- "$lldb -x -b -o 'b main' -o 'r' -o 'c' $App"
Benchmark 1: $lldb -x -b -o 'b main' -o 'r' -o 'c' $App
Time (mean ± σ): 6.327 s ± 0.023 s [User: 5.653 s, System: 0.296 s]
Range (min … max): 6.299 s … 6.361 s 10 runs
...
"memory": {
"strings": {
"bytesTotal": 133175645,
"bytesUnused": 52115081,
"bytesUsed": 81060564
}
},
From this, it looks like this is probably ever so slightly faster than with no
patch, but still not as fast as using `std::string`. The memory consumption
numbers are the exact same as using `std::string`. The conclusion I'm drawing
from all the data here is that: 1.) My patch does decrease the size of the
ConstString StringPool regardless of whether or not `m_full` is a std::string
or a ConstString, and 2.) the std::string implementation is slightly faster on
average than the ConstString one. I'll probably stick to this implementation
since it appears to be faster on average (at least on my machine), but I'll
update this PR to fix the documentation.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D149914/new/
https://reviews.llvm.org/D149914
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits