Skip to content

Instantly share code, notes, and snippets.

@dakkar
Last active December 27, 2019 21:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dakkar/e34d213e43fa7d2fa1b252784dfb36a1 to your computer and use it in GitHub Desktop.
Save dakkar/e34d213e43fa7d2fa1b252784dfb36a1 to your computer and use it in GitHub Desktop.
be faster by doing more work?
feeding a 18kb email message, I get:
$ perl6 /tmp/p.p6 medium-sized-email-message.txt
slurping 0.00634555
matching 1.1612016
parsing 0.02143336
use v6.d;
sub time(&block,:$name = 'took') {
my $start = now;
LEAVE { say "$name { now - $start }" }
return block();
}
my @separators = (
"\x0a\x0d\x0a\x0d",
"\x0d\x0a\x0d\x0a",
"\x0a\x0a",
"\x0d\x0d",
);
my grammar Message {
regex TOP {
<headers>
<separator>
<body>
}
token newline { [\x0d\x0a] | [\x0a\x0d] | \x0a | \x0d }
token separator { @separators }
token body { .* }
regex headers {
<header>+ % <newline>
}
regex header {
<name> \: \h* <value>
|| <junk>
}
token name {
<-[:\s]>+
}
regex value {
<line>+ % [<newline> \h+]
}
token line { \N* }
token junk { \N+ }
}
my Str $string = time :name('slurping'), { slurp(@*ARGS[0].IO,:enc<utf8-c8>) };
my $done = time :name('matching'), { $string ~~ /@separators/ };
my $match = time :name('parsing'), { Message.parse($string) };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment