[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Faster base64 -d
From: |
Jim Meyering |
Subject: |
Re: Faster base64 -d |
Date: |
Mon, 08 Apr 2013 06:13:20 +0200 |
Ole Tange wrote:
> I was astonished to learn that:
>
> perl -MMIME::Base64 -e 'while(read(STDIN,$buf,770*50)){print
> decode_base64($buf)}'
>
> is faster than:
>
> base64 -d
>
> I found this which might be faster:
> http://www.experts-exchange.com/Programming/System/Windows__Programming/A_3216-Fast-Base64-Encode-and-Decode.html
>
> I would reckon this would be even faster for decoding:
>
> WORD s1= gpLookup16[ pwSrc[0] ]; // translate two "digits" at once
> WORD s2= gpLookup16[ pwSrc[1] ]; // ... and two more
>
> // s1 = xx111111 222222xx
> // s2 = xx333333 444444xx
> pDst[0]= (s1 >> 6 & 0xff); // xxxxxxxx 11111122
> pDst[1]= (s1 << 2 & 0xf0 | s2 >> 10 & 0x0f); // xxxxxxxx 22223333
> pDst[2]= (s1 >> 2 & 0xff); // xxxxxxxx 33444444
Thanks for raising the issue.
I confirm the perl-based version takes less than 50% of base64 -d's
elapsed time on an old 2GHz celeron, e.g., running these:
seq 9999999 |base64 > k
env time base64 -d < k > /dev/null
env time perl -MMIME::Base64 -e \
'while(read(STDIN,$buf,770*50)){print decode_base64($buf)}' < k > /dev/null
On a more modern system, the perl version still completes
in about 30% less time.
Patches most welcome.