feat(ricepp): 15% decode speed improvement

This commit is contained in:
Marcus Holland-Moritz 2024-02-04 13:39:33 +01:00
parent 0a69be84f0
commit 107a89425e

View File

@ -64,11 +64,11 @@ class bitstream_reader final {
size_t find_first_set() { size_t find_first_set() {
size_t zeros = 0; size_t zeros = 0;
if (bit_pos_ != 0) { if (bit_pos_ != 0) [[likely]] {
size_t const remaining_bits = kBitsTypeBits - bit_pos_; size_t const remaining_bits = kBitsTypeBits - bit_pos_;
bits_type const bits = peek_bits(remaining_bits); bits_type const bits = peek_bits(remaining_bits);
size_t const ffs = std::countr_zero(bits); size_t const ffs = std::countr_zero(bits);
if (ffs < remaining_bits) { if (ffs < remaining_bits) [[likely]] {
skip_bits(ffs + 1); skip_bits(ffs + 1);
return ffs; return ffs;
} }
@ -77,10 +77,10 @@ class bitstream_reader final {
} }
for (;;) { for (;;) {
bits_type const bits = read_packet(); bits_type const bits = read_packet();
if (bits != bits_type{}) { if (bits != bits_type{}) [[likely]] {
size_t const ffs = std::countr_zero(bits); size_t const ffs = std::countr_zero(bits);
assert(ffs < kBitsTypeBits); assert(ffs < kBitsTypeBits);
if (ffs + 1 == kBitsTypeBits) { if (ffs + 1 == kBitsTypeBits) [[unlikely]] {
bit_pos_ = 0; bit_pos_ = 0;
} else { } else {
data_ = bits; data_ = bits;
@ -102,25 +102,25 @@ class bitstream_reader final {
void skip_bits(size_t num_bits) { void skip_bits(size_t num_bits) {
assert(bit_pos_ + num_bits <= kBitsTypeBits); assert(bit_pos_ + num_bits <= kBitsTypeBits);
bit_pos_ += num_bits; bit_pos_ += num_bits;
if (bit_pos_ == sizeof(bits_type) * 8) { if (bit_pos_ == sizeof(bits_type) * 8) [[unlikely]] {
bit_pos_ = 0; bit_pos_ = 0;
} }
} }
bits_type peek_bits(size_t num_bits) { bits_type peek_bits(size_t num_bits) {
assert(bit_pos_ + num_bits <= kBitsTypeBits); assert(bit_pos_ + num_bits <= kBitsTypeBits);
if (bit_pos_ == 0) { if (bit_pos_ == 0) [[unlikely]] {
data_ = read_packet(); data_ = read_packet();
} }
bits_type bits = data_ >> bit_pos_; bits_type bits = data_ >> bit_pos_;
if (num_bits < kBitsTypeBits) { if (num_bits < kBitsTypeBits) [[likely]] {
bits &= (static_cast<bits_type>(1) << num_bits) - 1; bits &= (static_cast<bits_type>(1) << num_bits) - 1;
} }
return bits; return bits;
} }
bits_type read_packet() { bits_type read_packet() {
if (beg_ == end_) { if (beg_ == end_) [[unlikely]] {
throw std::out_of_range{"bitstream_reader::read_packet"}; throw std::out_of_range{"bitstream_reader::read_packet"};
} }
return read_packet_nocheck(); return read_packet_nocheck();
@ -142,7 +142,7 @@ class bitstream_reader final {
bits_type bits{}; bits_type bits{};
auto bits_ptr = reinterpret_cast<uint8_t*>(&bits); auto bits_ptr = reinterpret_cast<uint8_t*>(&bits);
for (size_t i = 0; i < sizeof(bits_type); ++i) { for (size_t i = 0; i < sizeof(bits_type); ++i) {
if (beg_ == end_) { if (beg_ == end_) [[unlikely]] {
break; break;
} }
bits_ptr[i] = *beg_++; bits_ptr[i] = *beg_++;