On 29/12/2015 23:05, Timo Paulssen via RT wrote:
On 12/29/2015 12:46 AM, Jules Field (via RT) wrote:
# New Ticket Created by  Jules Field
# Please include the string:  [perl #127064]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=127064 >


Given
    my @lines = "some-text.txt".IO.lines;
    my $s = 'Jules';
(some-text.txt is about 43k lines)

Doing
    my @matching = @lines.grep(/ $s /);
is about 50 times slower than
    my @matching = @lines.grep(/ Jules /);

And if $s happened to contain anything other than literals, so I had to us
    my @matching = @lines.grep(/ <$s> /);
then it's nearly 150 times slower.

    my @matching = @lines.grep($s);
doesn't appear to work. It matches 0 lines but doesn't die.

The lack of Perl5's straightforward variable interpolation in regexs is 
crippling the speed.
Is there a faster alternative? (other than EVAL to build the regex)

For now, you can use @lines.grep(*.contains($s)), which will be
sufficiently fast.

Ideally, our regex optimizer would turn this simple regex into a code
that uses .index to find a literal string and construct a match object
for that. Or even - if you put a literal "so" in front - turn it into
.contains($literal) if it knows that the match object will only be
inspected for true/false.

Until then, we ought to be able to make interpolation a bit faster.
   - Timo
Many thanks for that. I hadn't thought to use Whatever.

I would ideally also be doing case-insensitive regexps, but they are 50 times slower than case-sensitive ones, even in trivial cases. Maybe a :adverb for rx// that says "give me static (i.e. Perl5-style) interpolation in this regex"? I can see the advantage of passing the variables to the regex engine, as then they can change over time.

But that's not something I want to do very often, far more frequently I just need to construct the regex at run-time and have it go as fast as possible.

Just thoughts from a big Perl5 user (e.g. MailScanner is 50k lines of it!).

Jules

--
ju...@jules.uk
Twitter: @JulesFM

'If I were a Brazilian without land or money or the means to feed
 my children, I would be burning the rain forest too.' - Sting


--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

Reply via email to