mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-25 14:31:35 +00:00
MemTableIterator not to reference Memtable
Summary: In one of the perf, I shows 10%-25% CPU costs of MemTableIterator.Seek(), when doing dynamic prefix seek, are spent on checking whether we need to do bloom filter check or finding out the prefix extractor. Seems that more level of pointer checking makes CPU cache miss more likely. This patch makes things slightly simpler by copying pointer of bloom of prefix extractor into the iterator. Test Plan: make all check Reviewers: haobo, ljin Reviewed By: ljin CC: igor, dhruba, yhchiang, leveldb Differential Revision: https://reviews.facebook.net/D17247
This commit is contained in:
parent
c8bb79978e
commit
2d3468c293
|
@ -155,22 +155,24 @@ const char* EncodeKey(std::string* scratch, const Slice& target) {
|
|||
class MemTableIterator: public Iterator {
|
||||
public:
|
||||
MemTableIterator(const MemTable& mem, const ReadOptions& options)
|
||||
: mem_(mem), iter_(), dynamic_prefix_seek_(false), valid_(false) {
|
||||
: bloom_(nullptr),
|
||||
prefix_extractor_(mem.prefix_extractor_),
|
||||
iter_(),
|
||||
valid_(false) {
|
||||
if (options.prefix) {
|
||||
iter_.reset(mem_.table_->GetPrefixIterator(*options.prefix));
|
||||
iter_.reset(mem.table_->GetPrefixIterator(*options.prefix));
|
||||
} else if (options.prefix_seek) {
|
||||
dynamic_prefix_seek_ = true;
|
||||
iter_.reset(mem_.table_->GetDynamicPrefixIterator());
|
||||
bloom_ = mem.prefix_bloom_.get();
|
||||
iter_.reset(mem.table_->GetDynamicPrefixIterator());
|
||||
} else {
|
||||
iter_.reset(mem_.table_->GetIterator());
|
||||
iter_.reset(mem.table_->GetIterator());
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool Valid() const { return valid_; }
|
||||
virtual void Seek(const Slice& k) {
|
||||
if (dynamic_prefix_seek_ && mem_.prefix_bloom_ &&
|
||||
!mem_.prefix_bloom_->MayContain(
|
||||
mem_.prefix_extractor_->Transform(ExtractUserKey(k)))) {
|
||||
if (bloom_ != nullptr &&
|
||||
!bloom_->MayContain(prefix_extractor_->Transform(ExtractUserKey(k)))) {
|
||||
valid_ = false;
|
||||
return;
|
||||
}
|
||||
|
@ -208,9 +210,9 @@ class MemTableIterator: public Iterator {
|
|||
virtual Status status() const { return Status::OK(); }
|
||||
|
||||
private:
|
||||
const MemTable& mem_;
|
||||
DynamicBloom* bloom_;
|
||||
const SliceTransform* const prefix_extractor_;
|
||||
std::shared_ptr<MemTableRep::Iterator> iter_;
|
||||
bool dynamic_prefix_seek_;
|
||||
bool valid_;
|
||||
|
||||
// No copying allowed
|
||||
|
|
Loading…
Reference in a new issue