coreutils
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]