mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 02:15:45 +02:00
chore: Implement AddMany method (#3866)
* chore: Implement AddMany method 1. Fix a performance bug in Find2 that made redundant comparisons 2. Provide a method to StringSet that adds several items in a batch 3. Use AddMany inside set_family Before: ``` BM_Add 4253939 ns 4253713 ns 991 ``` After: ``` BM_Add 3482177 ns 3482050 ns 1206 BM_AddMany 3101622 ns 3101507 ns 1360 ``` Signed-off-by: Roman Gershman <roman@dragonflydb.io> * chore: fixes --------- Signed-off-by: Roman Gershman <roman@dragonflydb.io>
This commit is contained in:
parent
a86fcf80be
commit
bd972b6384
6 changed files with 106 additions and 9 deletions
|
@ -549,6 +549,11 @@ void DenseSet::AddUnique(void* obj, bool has_ttl, uint64_t hashcode) {
|
|||
++size_;
|
||||
}
|
||||
|
||||
void DenseSet::Prefetch(uint64_t hash) {
|
||||
uint32_t bid = BucketId(hash);
|
||||
PREFETCH_READ(&entries_[bid]);
|
||||
}
|
||||
|
||||
auto DenseSet::Find2(const void* ptr, uint32_t bid, uint32_t cookie)
|
||||
-> tuple<size_t, DensePtr*, DensePtr*> {
|
||||
DCHECK_LT(bid, entries_.size());
|
||||
|
@ -563,19 +568,23 @@ auto DenseSet::Find2(const void* ptr, uint32_t bid, uint32_t cookie)
|
|||
// first look for displaced nodes since this is quicker than iterating a potential long chain
|
||||
if (bid > 0) {
|
||||
curr = &entries_[bid - 1];
|
||||
ExpireIfNeeded(nullptr, curr);
|
||||
if (curr->IsDisplaced() && curr->GetDisplacedDirection() == -1) {
|
||||
ExpireIfNeeded(nullptr, curr);
|
||||
|
||||
if (Equal(*curr, ptr, cookie)) {
|
||||
return {bid - 1, nullptr, curr};
|
||||
if (Equal(*curr, ptr, cookie)) {
|
||||
return {bid - 1, nullptr, curr};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bid + 1 < entries_.size()) {
|
||||
curr = &entries_[bid + 1];
|
||||
ExpireIfNeeded(nullptr, curr);
|
||||
if (curr->IsDisplaced() && curr->GetDisplacedDirection() == 1) {
|
||||
ExpireIfNeeded(nullptr, curr);
|
||||
|
||||
if (Equal(*curr, ptr, cookie)) {
|
||||
return {bid + 1, nullptr, curr};
|
||||
if (Equal(*curr, ptr, cookie)) {
|
||||
return {bid + 1, nullptr, curr};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue