[git commit] gzip: speed up send_bits()

Denys Vlasenko vda.linux at googlemail.com
Tue Jan 30 23:01:06 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=b7dfbbcdaaae5267259e2272b1cdfde6daad44a0
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Replace one RMW op with store. This speeds up gzip of a png file by ~2%.

function                                             old     new   delta
send_bits                                             62      66      +4

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 archival/gzip.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/archival/gzip.c b/archival/gzip.c
index f253a217a..08633d667 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -523,7 +523,6 @@ static unsigned file_read(void *buf, unsigned size)
 static void send_bits(unsigned value, unsigned length)
 {
 	unsigned new_buf;
-	unsigned remain;
 
 #ifdef DEBUG
 	Tracev((stderr, " l %2d v %4x ", length, value));
@@ -534,25 +533,26 @@ static void send_bits(unsigned value, unsigned length)
 
 	new_buf = G1.bi_buf | (value << G1.bi_valid);
 	/* NB: the above may sometimes do "<< 32" shift (undefined)
-	 * if check below is changed to "length > remain" instead of >= */
-	remain = BUF_SIZE - G1.bi_valid;
+	 * if check below is changed to "length > BUF_SIZE" instead of >= */
+	length += G1.bi_valid;
 
 	/* If bi_buf is full */
-	if (length >= remain) {
+	if (length >= BUF_SIZE) {
 		/* ...use (valid) bits from bi_buf and
 		 * (BUF_SIZE - bi_valid) bits from value,
 		 *  leaving (width - (BUF_SIZE-bi_valid)) unused bits in value.
 		 */
+		value >>= (BUF_SIZE - G1.bi_valid);
 		if (BUF_SIZE == 32) {
 			put_32bit(new_buf); /* maybe unroll to 2*put_16bit()? */
 		} else { /* 16 */
 			put_16bit(new_buf);
 		}
-		new_buf = value >> remain;
+		new_buf = value;
 		length -= BUF_SIZE;
 	}
 	G1.bi_buf = new_buf;
-	G1.bi_valid += length;
+	G1.bi_valid = length;
 }
 
 


More information about the busybox-cvs mailing list