develooper Front page | perl.perl6.users | Postings from September 2019

Re: anything faster than say [+] lines?

Thread Previous | Thread Next
From:
Vittore Scolari
Date:
September 23, 2019 18:29
Subject:
Re: anything faster than say [+] lines?
Message ID:
CAPDtZwRmm=CN4Ang5uuF=5-ssweWs5UttvgnbgeZnbP5EfwGzg@mail.gmail.com
Hi Liz,
bypassing $*ARGFILES.lines by using $*IN.lines, makes it faster for me than
using slurp, and seems like a more logic algorithm to solve the problem. I
think that, for any person that seriously thinks about using perl6 for
one-liners, using $*IN instead of $*ARGFILES is something to take into
consideration.

On Mon, Sep 23, 2019 at 8:16 PM Elizabeth Mattijsen <liz@dijkmat.nl> wrote:

> I've tested with a file with 1M numbers between 1..100.
>
> The quick answer would be: use `say lines.sum`.  But since `[+]` is
> already internally optimized to `.sum`, that doesn't make much sense.
>
> If you know that you will only see integer numbers, you can make it a bit
> faster by explicitly coercing to `Int` before summing:
>
>     say lines.map(*.Int).sum
>
> This takes it down from 2.9 seconds to 2.5 seconds for me.
>
> A quicker way I found is to bypass the overhead of finding lines, by
> slurping the whole file in one go, then splitting on newline and then
> summing:
>
>     say slurp.split("\n").sum
>
> This brings it down from 2.9 to about 2 seconds.
>
> Without resorting to NQP, I think that is what the current state of
> affairs is.
>
> > On 23 Sep 2019, at 19:57, Marc Chantreux <eiro@phear.org> wrote:
> >
> > hello,
> >
> > question: in raku, is there a faster solution than
> >
> >  say [+] lines
> >
> > long story;
> >
> > here is a thread i would like to reply to
> >
> >
> https://stackoverflow.com/questions/450799/shell-command-to-sum-integers-one-per-line
> >
> > because:
> >
> > * the perl5 answer is fast compared to the other dynamic langages
> > * the shortest solution is very interesting: even if you have an average
> >  level in dc (i think i have one), this is not that easy to read the
> >  answer (commented in the post)
> >
> >    dc -f infile -e '[+z1<r]srz1<rp'
> >
> > obvioulsy: raku would be my prefered answer with:
> >
> >   seq 100000000 | perl6 -e 'say [+] lines'
> >
> > but ...
> >
> >   seq 100000000 | time perl6 -e 'say [+] lines'
> >   5000000050000000
> >   perl6 -e 'say [+] lines'  1591,80s user 3,04s system 122% cpu 21:36,63
> total
> >
> >   seq 100000000 | time /usr/bin/perl6 -e 'say [+] lines'
> > 5000000050000000
> > /usr/bin/perl6 -e 'say [+] lines'  2171,01s user 4,64s system 129% cpu
> 28:04,73 total
> >
> > when
> >
> >  perl6 -v
> >    This is Rakudo version 2019.03.1 built on MoarVM version 2019.03
> >    implementing Perl 6.d.
> >  /usr/bin/perl6 -v
> >    This is Rakudo version 2018.12 built on MoarVM version 2018.12
> >    implementing Perl 6.d.
> >
> > regards
> > marc
>

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About