J'utilise une sorte de BitStream dans mon code qui a une fonction read_bit()
. Cette fonction est appelée très très souvent (plus d'un milliard de fois dans un seul flux). C'est ce que le Bitstream struct ressemble:Façon très rapide de vérifier le bit mis en C
typedef struct BitStream {
unsigned char* data;
unsigned int size;
unsigned int currentByte;
unsigned char buffer;
unsigned char bitsInBuffer;
} BitStream;
Et le read_bit()
-fonction est défini comme suit:
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;
}
}
Maintenant, j'ai découvert par essais et erreurs que la ligne unsigned char mask = 128 >> (bitPos & 7);
est très lent. Y a-t-il un moyen d'accélérer la vérification? J'ai déjà essayé d'utiliser un tableau qui indexe les 8 différents masques possibles, mais ce n'est pas plus rapide (je pense en raison de l'accès à la mémoire).
EDIT: J'ai essayé beaucoup de réponses au cours de la semaine dernière et j'ai effectué beaucoup de tests de performances, mais il n'y a pas eu beaucoup d'amélioration des performances. J'ai finalement réussi à obtenir une amélioration de 10 secondes en inversant l'ordre des bits dans le bitstream. Ainsi, au lieu d'utiliser le masque 128 >> (bitPos & 7)
, je la fonction:
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;
}
J'ai évidemment aussi changé la fonction d'écriture correspondante.
Quelle est la vitesse en ce moment? Comment "lent" (mais plus rapide que le courant) est acceptable?Combien de mémoire pouvez-vous consacrer à cela? Pouvez-vous inclure le démontage de la mise en œuvre actuelle? – Amit
La ligne particulière utilise environ 10s de 28s au total. Il devrait au moins être possible de le faire fonctionner en 5s (ou moins). Je peux consacrer un peu de mémoire pour cela (au moins 10 Mo). Je posterai le démontage bientôt. Merci d'avance –
Remplacez le '128 >> (bitPos & 7)' par un tableau de masque statique. –