labath added a comment.

In D122974#3482540 <https://reviews.llvm.org/D122974#3482540>, @llunak wrote:

> In D122974#3481852 <https://reviews.llvm.org/D122974#3481852>, @labath wrote:
>
>> In D122974#3481269 <https://reviews.llvm.org/D122974#3481269>, @llunak wrote:
>>
>>> But what if I don't want StringMap to compute the hash at all? There's 
>>> still that 10-15% of CPU time spent in djbHash() when debug info uses 
>>> exactly[*] that (and LLDB's index cache could be modified to store it). 
>>> Which means it can be useful for StringMap to allow accepting precomputed 
>>> hash, and then what purpose will that HashedStringRef have?
>>
>> I think that David's point was that you would use a (probably static) 
>> StringMap method to produce the hash object, and then you use the hash 
>> object to select the correct map, and also to insert the key in the map. 
>> Something like:
>
> ...
>
>> That should only produce one hash computation, right?
>
> Yes, it would, but that's not my point. If StringMap insists on computing the 
> hash itself and doesn't allow outside code to provide it, then that prevents 
> the possible LLDB optimization saving the remaing 10-15% startup CPU cost by 
> not computing the hash at all. If StringMap allows that, then this 
> HashedStringRef idea can be easily circumvented by passing the hash directly, 
> so it seems rather pointless. And the relevant LLDB code from this change is 
> so small that creating HashedStringRef just for that seems like an overkill.

Interesting. I don't know if I missed this somewhere, but could explain what 
kind of a map operation can lldb perform without computing the hash at least 
once?

>>> (*) Well, not exactly, the seed is different. Doesn't seem an impossible 
>>> problem to solve though.
>>
>> I think that's because it's trying to produce a value that is not correlated 
>> to the value used inside the individual objects (so that you don't overload 
>> some buckets of the maps while keeping others empty). However, there are 
>> other ways to achieve that. Since StringMap is always using a power of two 
>> for the number of buckets, I think it would be sufficient to use an odd 
>> number of StringMap instances (say 255). Using the modulo operation to 
>> select the StringMap should select spread out the complete hashes evenly 
>> among to individual maps.
>
> By different seed I meant that DWARF and StringMap use different seed for DJB 
> hash. And that's only because LLVM code historically used the worse 0 seed 
> and some tests rely on that (7b319df29bf4ebe690ca0c41761e46d8b0081293 
> <https://reviews.llvm.org/rG7b319df29bf4ebe690ca0c41761e46d8b0081293>). But 
> it seems that LLDB doesn't even read .debug_names entries into memory, so 
> this having anything to do with DWARF debuginfo is actually moot, it'd only 
> matter for LLDB index cache, which could use any hash it wants.
>
> But you're possibly talking about something unrelated here.

Yeah, I thought that the we used a different seed (or hash?) when computing the 
StringMap index -- I believe that was the case at some point, but I guess it 
was changed since then...


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D122974/new/

https://reviews.llvm.org/D122974

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to