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

Re: anything faster than say [+] lines?

Thread Previous | Thread Next
From:
Elizabeth Mattijsen
Date:
September 23, 2019 18:16
Subject:
Re: anything faster than say [+] lines?
Message ID:
839CD6FD-E714-42FD-9125-6DF3622B7D3A@dijkmat.nl
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