[Flac-dev] libFLAC bitbuffer optimizations

Josh Coalson xflac at yahoo.com
Mon Jan 24 18:52:25 PST 2005


Eric, I finally got around to your patches after Miroslav's.
the first one (the memcpy/memset replacement) I had problems
with, one because the buffers can overlap so I had to use
memmove (is this usually assembly in libc too?) and also the
endpoints looked wrong, for my full patch see below. speedup
for me was around 3%

the second patch got another 2%.  a question though, why do
you have:

+              *(++vals);

in two places instead of just ++vals; ?

Josh


Index: bitbuffer.c
===================================================================
RCS file: /cvsroot/flac/flac/src/libFLAC/bitbuffer.c,v
retrieving revision 1.55
diff -u -r1.55 bitbuffer.c
--- bitbuffer.c 25 Jan 2005 02:37:08 -0000  1.55
+++ bitbuffer.c 25 Jan 2005 02:39:52 -0000
@@ -228,11 +228,27 @@

    /* first shift the unconsumed buffer data toward the front as much
as possible */
    if(bb->total_consumed_bits >= FLAC__BITS_PER_BLURB) {
-       unsigned l = 0, r = bb->consumed_blurbs, r_end = bb->blurbs +
(bb->bits? 1:0);
+#if FLAC__BITS_PER_BLURB == 8
+       /*
+        * memset and memcpy are usually implemented in assembly
language
+        * by the system libc, and they can be much faster
+        */
+       const unsigned r_end = bb->blurbs + (bb->bits? 1:0);
+       const unsigned r = bb->consumed_blurbs, l = r_end - r;
+       memmove(&bb->buffer[0], &bb->buffer[r], l);
+       memset(&bb->buffer[l], 0, r);
+#elif FLAC__BITS_PER_BLURB == 32
+       /* still needs optimization */
+       const unsigned r_end = bb->blurbs + (bb->bits? 1:0);
+       unsigned l = 0, r = bb->consumed_blurbs;
        for( ; r < r_end; l++, r++)
            bb->buffer[l] = bb->buffer[r];
        for( ; l < r_end; l++)
            bb->buffer[l] = 0;
+#else
+       FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are
supported */
+#endif /* FLAC__BITS_PER_BLURB == 32 or 8 */
+
        bb->blurbs -= bb->consumed_blurbs;
        bb->total_bits -= FLAC__BLURBS_TO_BITS(bb->consumed_blurbs);
        bb->consumed_blurbs = 0;



		
__________________________________ 
Do you Yahoo!? 
Yahoo! Mail - Easier than ever with enhanced search. Learn more.
http://info.mail.yahoo.com/mail_250


More information about the Flac-dev mailing list