function old new delta unpack_lzma_stream 2482 2400 -82 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-82) Total: -82 bytes $ grep LZMA_FAST .config CONFIG_FEATURE_LZMA_FAST=y $ ./busybox_old unlzma < ../linux-2.6.23.tar.lzma > /dev/null Using fallback suid method real 0m10.957s user 0m10.901s sys 0m0.044s $ ./busybox_unstripped unlzma < ../linux-2.6.23.tar.lzma > /dev/null Using fallback suid method real 0m10.781s user 0m10.713s sys 0m0.056s --- archival/libunarchive/decompress_unlzma.c 2007-09-03 13:48:34.000000000 +0200 +++ archival/libunarchive/decompress_unlzma.c 2008-03-03 10:51:46.000000000 +0100 @@ -317,8 +317,15 @@ prob_lit = prob + mi; rc_get_bit(rc, prob_lit, &mi); } - previous_byte = (uint8_t) mi; + state -= 3; + if (state < 4-3) + state = 0; + if (state >= 10-3) + state -= 6-3; + + previous_byte = (uint8_t) mi; + one_byte: buffer[buffer_pos++] = previous_byte; if (buffer_pos == header.dict_size) { buffer_pos = 0; @@ -327,12 +334,6 @@ goto bad; USE_DESKTOP(total_written += header.dict_size;) } - if (state < 4) - state = 0; - else if (state < 10) - state -= 3; - else - state -= 6; } else { int offset; uint16_t *prob_len; @@ -361,15 +362,7 @@ while (pos >= header.dict_size) pos += header.dict_size; previous_byte = buffer[pos]; - buffer[buffer_pos++] = previous_byte; - if (buffer_pos == header.dict_size) { - buffer_pos = 0; - global_pos += header.dict_size; - if (full_write(dst_fd, buffer, header.dict_size) != header.dict_size) - goto bad; - USE_DESKTOP(total_written += header.dict_size;) - } - continue; + goto one_byte; } else { rc_update_bit_1(rc, prob); }