From 31dbd21c02b62f9899e802579f3ca0e507faab38 Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Wed, 9 Mar 2011 14:05:16 +0100 Subject: [PATCH] Optimization of the BitBuffer class This made our usage of it about 20% faster. This is done mainly by avoiding making (shorter) copies of the buffer string when reading. --- lib/modules/ADT.pmod/BitBuffer.pike | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/modules/ADT.pmod/BitBuffer.pike b/lib/modules/ADT.pmod/BitBuffer.pike index 5d167b561a..04926af18b 100644 --- a/lib/modules/ADT.pmod/BitBuffer.pike +++ b/lib/modules/ADT.pmod/BitBuffer.pike @@ -32,13 +32,20 @@ protected void create(void|string data) { this_program feed( string x ) { if(String.width(x)!=8) error("Only eight bits wide characters allowed.\n"); if(bob) - foreach(x; int p; int c) + foreach(x;; int c) put(c,8); else - data += x; + { + if(dptr) { + data = data[dptr..]; + dptr = 0; + } + data += x; + } return this; } + //! Drains the buffer of all full (8-bits wide) bytes. string drain() { if(_sizeof()<8) @@ -59,6 +66,8 @@ string drain() { protected int out_buffer, bib; +#define pow2(X) (1<<(X)) + //! Get @[bits] from the buffer. //! //! @throws @@ -79,18 +88,14 @@ int get( int bits ) { if(bob<n) error("BitBuffer undeflow.\n"); out_buffer = (out_buffer<<n) | (in_buffer>>(bob-n)); bib += n; - in_buffer &= pow(2,bob-n)-1; + in_buffer &= pow2(bob-n)-1; bob -= n; } int res = out_buffer>>(bib-bits); - out_buffer &= pow(2,bib-bits)-1; + out_buffer &= pow2(bib-bits)-1; bib-=bits; - if(dptr>64) { - data = data[dptr..]; - dptr = 0; - } return res; } @@ -122,6 +127,10 @@ protected int in_buffer, bob; //! bit first. this_program put( int value, int bits ) { // werror("\n%O %O %O\n", bob, bib, bits); + if(dptr) { + data = data[dptr..]; + dptr = 0; + } if(!bits) return this; bob += bits; in_buffer <<= bits; -- GitLab