读位性能

Reading bits performance

本文关键字:性能      更新时间:2023-10-16

我正在编写一个helper类,我打算使用它从数据块中反向读取位。

我试着做一个优化,我使用"rol"指令来屏蔽数据。然而,令我惊讶的是,这实际上比每次访问时创建一个新的位掩码要慢。

class reverse_bit_reader
{
public:
    static const size_t bits_per_block = sizeof(unsigned long)*8;
    static const size_t high_bit = 1 << (bits_per_block-1);
    reverse_bit_reader(const void* data, size_t size) 
        : data_(reinterpret_cast<const unsigned long*>(data))
        , index_(size-1)
    {
            // Bits are stored in left to right order, potentially ignore the last bits
        size_t last_bit_index = index_ % bits_per_block;
        bit_mask_ = high_bit >> (last_bit_index+1);
        if(bit_mask_ == 0)
            bit_mask_ = high_bit;
    }
    bool next_bit1()
    {
        return get_bit(index_--);   
    }
    bool next_bit2() // Why is next_bit1 faster?
    {
        __asm // Rotate bit_mask.
        {
            mov eax, [ecx+0];  
            rol eax, 1;
            mov [ecx+0], eax;
        }
        return data_[index_-- / bits_per_block] & bit_mask_;    
    }
    bool eof() const{return index_ < 0;}
private:
    bool get_bit(size_t index) const
    {       
        const size_t block_index = index / bits_per_block;
        const size_t bit_index = index % bits_per_block;
        const size_t bit_mask = high_bit >> bit_index;
        return data_[block_index] & bit_mask;
    }
    unsigned long bit_mask_;
    int index_;
    const unsigned long* data_;
};

谁能解释为什么next_bit1比next_bit2快?

如果您要从long数中顺序读取位,从最高有效位开始,并且您希望它尽可能快,您可以按照这些行做一些事情吗?

#define GETBIT ((theBit = (theLong < 0)), (theLong <<= 1), theBit)