bzip2: ~1% speedup by special-casing "store 1 bit" function
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 3 Feb 2018 03:43:46 +0000 (04:43 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 3 Feb 2018 03:43:46 +0000 (04:43 +0100)
function                                             old     new   delta
bsW1                                                   -      52     +52
BZ2_compressBlock                                    230     225      -5
BZ2_blockSort                                        125     118      -7
sendMTFValues                                       2070    2051     -19
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/3 up/down: 52/-31)             Total: 21 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/libarchive/bz/blocksort.c
archival/libarchive/bz/bzlib.c
archival/libarchive/bz/compress.c

index e600cb7a76d297a161393a4c94ba6e32e15b35a3..a3b099f4bd5af57334d34e03b835c32256473593 100644 (file)
@@ -1056,7 +1056,9 @@ void BZ2_blockSort(EState* s)
                }
        }
 
+#if BZ_LIGHT_DEBUG
        s->origPtr = -1;
+#endif
        for (i = 0; i < s->nblock; i++)
                if (ptr[i] == 0) {
                        s->origPtr = i;
index 3572474f4faf7b77ce13190a761d3b2f286dd972..ef98bb2132b9f08aa1db150a6c949ecba90df0fc 100644 (file)
@@ -55,7 +55,7 @@ void prepare_new_block(EState* s)
 {
        int i;
        s->nblock = 0;
-       //indexes inot s->zbits[], initialzation moved to init of s->zbits
+       //indexes into s->zbits[], initialzation moved to init of s->zbits
        //s->posZ = s->zbits; // was: s->numZ = 0;
        //s->state_out_pos = s->zbits;
        BZ_INITIALISE_CRC(s->blockCRC);
index 271982cf2eb16b3954c467814458c25e7f5baaac..4d0f77592838bfb4dfb1f3b7628d1273e0cad48d 100644 (file)
@@ -88,6 +88,22 @@ void bsW16(EState* s, uint32_t v)
        s->bsBuff |= (v << (16 - s->bsLive));
        s->bsLive += 16;
 }
+/* Same with n == 1: */
+static
+#if CONFIG_BZIP2_FAST >= 5
+ALWAYS_INLINE
+#endif
+void bsW1(EState* s, uint32_t v)
+{
+       /* need space for only 1 bit, no need for loop freeing > 8 bits */
+       if (s->bsLive >= 8) {
+               *s->posZ++ = (uint8_t)(s->bsBuff >> 24);
+               s->bsBuff <<= 8;
+               s->bsLive -= 8;
+       }
+       s->bsBuff |= (v << (31 - s->bsLive));
+       s->bsLive += 1;
+}
 
 
 /*---------------------------------------------------*/
@@ -557,8 +573,8 @@ void sendMTFValues(EState* s)
        for (i = 0; i < nSelectors; i++) {
                unsigned j;
                for (j = 0; j < s->selectorMtf[i]; j++)
-                       bsW(s, 1, 1);
-               bsW(s, 1, 0);
+                       bsW1(s, 1);
+               bsW1(s, 0);
        }
 
        /*--- Now the coding tables. ---*/
@@ -568,7 +584,7 @@ void sendMTFValues(EState* s)
                for (i = 0; i < alphaSize; i++) {
                        while (curr < s->len[t][i]) { bsW(s, 2, 2); curr++; /* 10 */ };
                        while (curr > s->len[t][i]) { bsW(s, 2, 3); curr--; /* 11 */ };
-                       bsW(s, 1, 0);
+                       bsW1(s, 0);
                }
        }
 
@@ -682,7 +698,7 @@ void BZ2_compressBlock(EState* s, int is_last_block)
                 * so as to maintain backwards compatibility with
                 * older versions of bzip2.
                 */
-               bsW(s, 1, 0);
+               bsW1(s, 0);
 
                bsW(s, 24, s->origPtr);
                generateMTFValues(s);