From 2d3468c2939b86eaa8b68c9c5c163504dccc0de0 Mon Sep 17 00:00:00 2001 From: sdong Date: Fri, 28 Mar 2014 14:38:10 -0700 Subject: [PATCH] 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 --- db/memtable.cc | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/db/memtable.cc b/db/memtable.cc index 41dd66cb9..b520fe25d 100644 --- a/db/memtable.cc +++ b/db/memtable.cc @@ -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 iter_; - bool dynamic_prefix_seek_; bool valid_; // No copying allowed