私のアプリケーションでは、CPU 時間の 20% がビット リーダーによるビット ( ) の読み取りに費やされskip
ています。次のコードを高速化する方法を知っている人はいますか? 任意の時点で、20 を超える有効なビットは必要ありません (これが、状況によっては を使用できる理由ですfast_skip
)。
ビットはビッグ エンディアン順で読み取られるため、バイト スワップが必要になります。
class bit_reader
{
std::uint32_t* m_data;
std::size_t m_pos;
std::uint64_t m_block;
public:
bit_reader(void* data)
: m_data(reinterpret_cast<std::uint32_t*>(data))
, m_pos(0)
, m_block(_byteswap_uint64(*reinterpret_cast<std::uint64_t*>(data)))
{
}
std::uint64_t value(std::size_t n_bits = 64)
{
assert(m_pos + n_bits < 64);
return (m_block << m_pos) >> (64 - n_bits);
}
void skip(std::size_t n_bits) // 20% cpu time
{
assert(m_pos + n_bits < 42);
m_pos += n_bits;
if(m_pos > 31)
{
m_block = _byteswap_uint64(reinterpret_cast<std::uint64_t*>(++m_data)[0]);
m_pos -= 32;
}
}
void fast_skip(std::size_t n_bits)
{
assert(m_pos + n_bits < 42);
m_pos += n_bits;
}
};
ターゲット ハードウェアは x64 です。