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

Reply via email to