Hi Shiome.I'm the very, very beginner in Perl. In moment i can't help you.
I'm iniciate study in Perl on this week.
Sorry.
Em Quinta-feira, 30 de Julho de 2015 18:27, Shlomi Fish
<[email protected]> escreveu:
Hi David,
see below for my comments on your code.
On Thu, 30 Jul 2015 22:14:55 +0200
David Emanuel da Costa Santiago <[email protected]> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
>
> Hello,
>
> I'm developing a perl yenc encoder but unfortunatelly it's not having
> the performance i was expecting to have (and it's CPU heavy).
>
> Can i get some help improving it's performance?
>
> This is the code i have (41 lines).
>
> Initially i though about memoize it, but unfortunately i don't think
> it's possible.
>
> Replacing the for loop with a map, would be a good option? Does anybody
> has any idea to improve it's performance?
>
>
>
> Regards,
> David Santiago
>
>
> CODE: The following function receives a binary string.
>
> ####
>
> my @YENC_CHAR_MAP = map{($_+42)%256;} (0..0xffff);
$X % 256 can also be written as ($X & 0xFF) (and should be a bit faster). Also
note that you can easily use (@LIST) x $N to repeat it here.
> my $YENC_NNTP_LINESIZE=128;
>
> sub _yenc_encode{
> my ($string) = @_;
> my $column = 0;
> my $content = '';
>
> my @hexString = unpack('W*',$string); #Converts binary string to hex
>
> for my $hexChar (@hexString) {
Since @hexString is used only once, you can put it inside the for :
for my $hexChar (unpack('W*',$string)) {
> my $char= $YENC_CHAR_MAP[$hexChar];
>
> #null || LF || CR || =
> if ($char == 0 || $char == 10 || $char == 13 || $char == 61 ||
>
Since you have many $char == $X || $char == $Y , you can convert it to a hash
or in your case using perldoc -f vec may do the trick:
http://perldoc.perl.org/functions/vec.html
> # TAB || SPC
> (($char == 9 || $char == 32) && ($column == $YENC_NNTP_LINESIZE
> || $column==0)) ||
>
> ($char==46 && $column==0) # .
> ) {
>
> $content =$content. '=';
This can be written as:
$content .= '=';
> $column+=1;
$column++;
>
> $char=($char + 64);#%256;
$char += 64;
> }
>
> $content = $content.chr $char;
$content .= chr($char);
>
> $column+=1;
$column++;
>
> if ($column>= $YENC_NNTP_LINESIZE ) {
> $column=0;
> $content = $content."\r\n";
$content .= "\r\n";
And note that \r\n is not very portable:
> }
>
> }
>
> return $content;
> }
>
Finally, note that you may opt to write such speed-critical code in C or C++ and
bind it to Perl using XS or Inline::C :
* https://metacpan.org/pod/distribution/Inline-C/lib/Inline/C.pod
Regards,
Shlomi Fish
--
-----------------------------------------------------------------
Shlomi Fish http://www.shlomifish.org/
Best Introductory Programming Language - http://shlom.in/intro-lang
Chuck Norris can only convince you that you're deceased. Summer Glau can
also convince you that you're alive, which is much harder.
— http://www.shlomifish.org/humour/bits/facts/Summer-Glau/
Please reply to list if it's a mailing list post - http://shlom.in/reply .
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/