summaryrefslogtreecommitdiffstats
path: root/components/packed_ct_ev_whitelist
diff options
context:
space:
mode:
authorian <ian@chromium.org>2015-04-15 12:14:57 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-15 19:15:23 +0000
commitca0d5d46c95fa5e8d5c89a979baba0c5b6bbefd0 (patch)
treeab5f3aa21fde0e09375caf615f83e31ed7791e95 /components/packed_ct_ev_whitelist
parent302a0e2a06dc3fbf898a164668ee74104eee2512 (diff)
downloadchromium_src-ca0d5d46c95fa5e8d5c89a979baba0c5b6bbefd0.zip
chromium_src-ca0d5d46c95fa5e8d5c89a979baba0c5b6bbefd0.tar.gz
chromium_src-ca0d5d46c95fa5e8d5c89a979baba0c5b6bbefd0.tar.bz2
Optimize BitStreamReader, speed up EV Whitelist loading
The EV Certificate Whitelist loads ~1MB of data using BitStreamReader. Currently this is read in one bit at a time. Changing BitStreamReader to support byte reads sped up loading by about 65% on my computer. BUG=457949 TEST=bit_stream_reader_unittest.cc Review URL: https://codereview.chromium.org/1070903003 Cr-Commit-Position: refs/heads/master@{#325286}
Diffstat (limited to 'components/packed_ct_ev_whitelist')
-rw-r--r--components/packed_ct_ev_whitelist/bit_stream_reader.cc17
-rw-r--r--components/packed_ct_ev_whitelist/bit_stream_reader.h5
2 files changed, 20 insertions, 2 deletions
diff --git a/components/packed_ct_ev_whitelist/bit_stream_reader.cc b/components/packed_ct_ev_whitelist/bit_stream_reader.cc
index e4f6cc7..94ef009 100644
--- a/components/packed_ct_ev_whitelist/bit_stream_reader.cc
+++ b/components/packed_ct_ev_whitelist/bit_stream_reader.cc
@@ -34,8 +34,13 @@ bool BitStreamReader::ReadBits(uint8_t num_bits, uint64_t* out) {
return false;
*out = 0;
- for (uint8_t i = 0; i < num_bits; ++i)
- (*out) |= (static_cast<uint64_t>(ReadBit()) << (num_bits - (i + 1)));
+
+ for (; num_bits && (current_bit_ != 7); --num_bits)
+ (*out) |= (static_cast<uint64_t>(ReadBit()) << (num_bits - 1));
+ for (; num_bits / 8; num_bits -= 8)
+ (*out) |= (static_cast<uint64_t>(ReadByte()) << (num_bits - 8));
+ for (; num_bits; --num_bits)
+ (*out) |= (static_cast<uint64_t>(ReadBit()) << (num_bits - 1));
return true;
}
@@ -61,5 +66,13 @@ uint8_t BitStreamReader::ReadBit() {
return res;
}
+uint8_t BitStreamReader::ReadByte() {
+ DCHECK_GT(BitsLeft(), 7u);
+ DCHECK_EQ(current_bit_, 7);
+
+ return source_.data()[current_byte_++];
+
+}
+
} // namespace internal
} // namespace packed_ct_ev_whitelist
diff --git a/components/packed_ct_ev_whitelist/bit_stream_reader.h b/components/packed_ct_ev_whitelist/bit_stream_reader.h
index 45fa5f5..5c95243 100644
--- a/components/packed_ct_ev_whitelist/bit_stream_reader.h
+++ b/components/packed_ct_ev_whitelist/bit_stream_reader.h
@@ -41,6 +41,11 @@ class BitStreamReader {
// LSB.
uint8_t ReadBit();
+ // Reads a single byte.
+ // Precondition: The stream must be byte-aligned (current_bit_ == 7) before
+ // calling this function.
+ uint8_t ReadByte();
+
const base::StringPiece source_;
// Index of the byte currently being read from.