From d3d1c8a0f40a7eaa12a5bb702fa01786b7c3a646 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 25 Apr 2019 09:44:07 +0800 Subject: [PATCH] don't check current key in DBIter::Next() When iter_ is pointing to current key, we can safely move to the next key to avoid checking current key, which is of course not necessary. Benchmark shows that 'readseq' has about 8% performance improvement. Without patch: >./db_bench --benchmarks=readseq --num=$((4<<20)) --db=/tmp/db --use_existing_db=1 LevelDB: version 1.21 Date: Thu Apr 25 09:37:21 2019 CPU: 32 * Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz CPUCache: 20480 KB Keys: 16 bytes each Values: 100 bytes each (50 bytes after compression) Entries: 4194304 RawSize: 464.0 MB (estimated) FileSize: 264.0 MB (estimated) ------------------------------------------------ readseq : 0.196 micros/op; 565.7 MB/s With patch: >./db_bench --benchmarks=readseq --num=$((4<<20)) --db=/tmp/db --use_existing_db=1 LevelDB: version 1.21 Date: Thu Apr 25 09:38:20 2019 CPU: 32 * Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz CPUCache: 20480 KB Keys: 16 bytes each Values: 100 bytes each (50 bytes after compression) Entries: 4194304 RawSize: 464.0 MB (estimated) FileSize: 264.0 MB (estimated) ------------------------------------------------ readseq : 0.181 micros/op; 612.3 MB/s Signed-off-by: Kyle Zhang --- db/db_iter.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/db/db_iter.cc b/db/db_iter.cc index 4d0f42e..48ca4a5 100644 --- a/db/db_iter.cc +++ b/db/db_iter.cc @@ -168,6 +168,15 @@ void DBIter::Next() { } else { // Store in saved_key_ the current key so we skip it below. SaveKey(ExtractUserKey(iter_->key()), &saved_key_); + + // iter_ is pointing to current key. We can now safely move to the next to + // avoid checking current key. + iter_->Next(); + if (!iter_->Valid()) { + valid_ = false; + saved_key_.clear(); + return; + } } FindNextUserEntry(true, &saved_key_);