我在我的代碼中使用某種類型的BitStream,它具有read_bit()
功能。這個函數被非常頻繁地調用(單個流中超過10億次)。這是結構比特流的樣子:非常快速的方法來檢查C中的設置位
typedef struct BitStream {
unsigned char* data;
unsigned int size;
unsigned int currentByte;
unsigned char buffer;
unsigned char bitsInBuffer;
} BitStream;
而且read_bit()
- 函數的定義如下:
unsigned char bitstream_read_bit(BitStream* stream, unsigned long long bitPos) {
unsigned int byte = bitPos/8;
unsigned char byteVal = stream->data[byte];
unsigned char mask = 128 >> (bitPos & 7);
if (mask & byteVal) {
return 1;
} else {
return 0;
}
}
現在,我發現通過試錯,該行unsigned char mask = 128 >> (bitPos & 7);
很慢。有什麼方法可以加快檢查的速度?我已經嘗試過使用索引8種不同可能掩碼的數組,但這不是更快(我認爲是由於內存訪問)。
編輯:我在過去一週嘗試了很多答案,並執行了很多基準測試,但沒有太多的性能改進。我最終設法通過顛倒比特流中的比特順序來獲得10秒的改進。因此,而不是使用掩膜128 >> (bitPos & 7)
,我使用的功能:
unsigned char bitstream_read_bit_2(BitStream* stream, const unsigned long long bitPos) {
unsigned int byte = (unsigned int) (bitPos/8);
unsigned char byteVal = stream->data[byte];
unsigned char mod = bitPos & 7;
return (byteVal & (1 << mod)) >> mod;
}
我已經很明顯也改變了相應的寫入功能。
目前速度有多慢?如何「慢」(但比當前更快)是可以接受的?你可以爲此獻出多少內存?你能否包含當前實現的反彙編? – Amit
特定行使用總共28s中的大約10s。至少應該可以使它在5秒(或更少)內工作。我可以爲此獻出相當多的內存(至少10MB)。我將很快發佈反彙編。提前致謝 –
用一個靜態掩碼數組替換'128 >>(bitPos&7)'。 –