[Leipzig-pm] Perl5 und Perl6 für Performance-Vergleich von Fefe

Heiko Hartje heiko at hartje-it.de
Sat Mar 23 17:01:16 PDT 2019


Hallo Daniel,

ich finde übrigens nicht, daß Perl gut abschneidet in dem Test. 
Eigentlich bestätigt es eher, was sowieso alle von Perl denken. Es sei 
langsam. In diesem Test etwa die Hälfte langsamer als PHP und Java.

Ich habe Deine Anregung aufgegriffen und mal untersucht, wie sich die 
Geschwindigkeit ändert mit einer Schwartzschen Transformation.

Beim ursprünglichen Code kriege ich die Eingabe nicht beendet (unter 
Windows). Deshalb habe ich einen Abbruch in die Schleife eingefügt:

#!/usr/bin/perl
use strict;
my %count = ();
while (<>) {
    chomp;
    last unless $_;
    for (split) {
        $count{$_}++;
    }
}
my @keys = sort { $count{$b} <=> $count{$a} } keys %count;
foreach my $key (@keys) {
    print $key, ' ', $count{$key}, "\n";
}

Dann habe ich die Sortierung umgewandelt in ein map-sort-map:

#!/usr/bin/perl
use strict;
my %count = ();
while (<>) {
    chomp;
    last unless $_;
    for (split) {
        $count{$_}++;
    }
}
my @keys = map { $_->[0] }
    sort { @$b[1] <=> @$a[1] }
    map {[$_, $count{$_}]} keys %count;
foreach my $key (@keys) {
    print $key, ' ', $count{$key}, "\n";
}

Das habe ich zusammengebaut in eine einzige Datei:

#!/usr/bin/perl
use strict;
use Time::HiRes qw(gettimeofday);

my %count = ();

while (<>) {
    chomp;
    last unless $_;
    for (split) {
        $count{$_}++;
    }
}

{
    my $start = gettimeofday();
    my @keys = sort { $count{$b} <=> $count{$a} } keys %count;
    print gettimeofday() - $start, "\n";
}

{
    my $start = gettimeofday();
    my @keys = map { $_->[0] }
        sort { @$b[1] <=> @$a[1] }
        map {[$_, $count{$_}]} keys %count;
    print gettimeofday() - $start, "\n";
}

Das Ergebnis ist ernüchternd (mit 1000 Wörtern des lorem-ipsum-Textes):
0.000162124633789063
0.000192165374755859

Meine Vermutung: wenn die Vergleichsroutine ($a <=> $b) ausreichend einfach 
ist, wird sie durch einen Aufruf kompilierten C-Codes ersetzt. 
Möglicherweise geschieht dies auch noch bei $c{$a} <=> $c{$b}.

Oder ich habe die Transformation falsch angewendet. Jemand eine Idee?

Viele Grüße

Heiko

perl -v
This is perl 5, version 16, subversion 1 (v5.16.1) built for 
MSWin32-x64-multi-thread



--On Samstag, 23. März 2019 19:22 +0100 Daniel Böhmer 
<post at daniel-boehmer.de> wrote:

> Hallo,
>
> siehe https://blog.fefe.de/?ts=a2689de5
>
> Alle Daten dazu: https://ptrace.fefe.de/wp/
>
> Ich finde Performance für meine Zwecke nicht besonders wichtig,
> aber schätze es wert, dass Perl5 unter den Skriptsprachen insgesamt
> gut dasteht. Die Aktion von Fefe finde ich fürs Marketing und
> aus Neugier ganz interessant.
>
> Die aktuell vorhandene Perl5-Implementierung ist schon recht
> geschickt.
>
> https://ptrace.fefe.de/wp/wp.pl
>
> Würde hier eine Schwartzian Transform helfen, die vielen Hash-Lookups
> zu vermeiden? https://en.wikipedia.org/wiki/Schwartzian_transform
>
> Herbert, hast du nicht Lust, eine Perl6-Implementierung einzureichen?
> Wenn du das als Gist bei GitHub anlegst, könnten wir versuchen,
> sie gemeinsam zu optimieren. Ich habe leider immer noch zu wenig
> Perl6 gemacht, um mit einer sinnvollen Version zu starten:(
>
> Viele Grüße
> Daniel
> _______________________________________________
> Leipzig-pm mailing list
> Leipzig-pm at pm.org
> https://mail.pm.org/mailman/listinfo/leipzig-pm
> http://leipzig.pm.org/



-- 
Heiko Hartje
heiko at hartje-it.de

Hartje IT
Körnerstraße 4
06114 Halle
Telefon: +49 163 96 18 303, auch per Signal-App
Internet: http://hartje-it.de/


More information about the Leipzig-pm mailing list