http://qs1969.pair.com?node_id=439416


in reply to Re^2: Efficient 7bit compression
in thread Efficient 7bit compression

I'm not sure how this fares in reguard to speed, but it only uses 2-5 scalars, tries to avoid generating intermidiate lists, and modifies their arguments inplace.
sub shrink { my $dbit = 0; for (my $sbit = 0; $sbit < length($_[0]) * 8; $sbit++) { next if $sbit % 8 == 7; vec($_[0], $dbit++, 1) = vec($_[0], $sbit, 1); } my $dlen = length($_[0]) * 7 / 8; $dlen++ unless $dlen == int($dlen); $dlen = int($dlen); my $extra = length($_[0]) - $dlen; if ($extra > 0) { substr($_[0], $dlen, $extra, ''); } for (my $pbit = $dbit; $pbit < $dlen * 8; $pbit++) { vec($_[0], $pbit, 1) = 0; } } sub grow { my $sbit = int(length($_[0]) * 8 / 7) * 7 - 1; for (my $dbit = int(length($_[0]) * 8 / 7) * 8 - 1; $dbit >= 0; $d +bit--) { vec($_[0], $dbit, 1) = $dbit % 8 == 7 ? 0 : vec($_[0], $sbit-- +, 1); } }
I have the nagging fealing there is a better way to implement ceil (near the middle of shrink).
If padding the compressed string with 0 bits is not needed then the second for loop of shrink can be omitted to save (on average) 4 bits of time.

Replies are listed 'Best First'.
Re^4: Efficient 7bit compression
by Roy Johnson (Monsignor) on Mar 14, 2005 at 20:22 UTC
    ...a better way to implement ceil...
    my $dlen = int((7 + length($_[0]) * 7)/8); substr($_[0], $dlen) = ''; vec ($_[0], $dbit++, 1) = 0 while ($dbit < $dlen * 8); }
    This replaces your shrink function from the definition of $dlen on.

    Caution: Contents may have been coded under pressure.