zu überprüfen Ich verwende eine Art BitStream in meinem Code, der eine read_bit()
-Funktion hat. Diese Funktion wird sehr oft (mehr als eine Milliarde Mal in einem einzelnen Stream) aufgerufen. Dies ist, was die Struktur BitStream wie folgt aussieht:Sehr schnelle Möglichkeit, gesetztes Bit in C
typedef struct BitStream {
unsigned char* data;
unsigned int size;
unsigned int currentByte;
unsigned char buffer;
unsigned char bitsInBuffer;
} BitStream;
Und die read_bit()
-function ist wie folgt definiert:
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;
}
}
Nun fand ich durch Versuch und Irrtum, dass die Linie unsigned char mask = 128 >> (bitPos & 7);
ist sehr langsam. Gibt es eine Möglichkeit, die Prüfung etwas zu beschleunigen? Ich habe bereits versucht, ein Array zu verwenden, das die 8 verschiedenen möglichen Masken indiziert, aber das ist nicht schneller (ich denke aufgrund des Speicherzugriffs).
EDIT: Ich habe viele der Antworten in der vergangenen Woche ausprobiert und viele Benchmarks durchgeführt, aber es gab nicht viel Leistungsverbesserung. Ich habe es schließlich geschafft, eine Verbesserung von 10 Sekunden zu erreichen, indem ich die Reihenfolge der Bits im Bitstrom umkehrte. Anstatt also die Maske mit 128 >> (bitPos & 7)
, benutzte ich die Funktion:
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;
}
Ich habe natürlich auch die entsprechende Schreibfunktion verändert.
Wie langsam ist es im Moment? Wie "langsam" (aber schneller als aktuell) ist akzeptabel?Wie viel Speicher können Sie dafür aufwenden? Können Sie die Demontage der aktuellen Implementierung einbeziehen? – Amit
Die besondere Linie verwendet etwa 10s von insgesamt 28s. Es sollte zumindest möglich sein, es in 5s (oder weniger) arbeiten zu lassen. Dafür kann ich mir einiges einfallen lassen (mindestens 10MB). Ich werde die Demontage bald posten. Vielen Dank im Voraus –
Ersetzen Sie die '128 >> (bitPos & 7)' durch ein statisches Maskenarray. –