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

Steffen Winkler steffen at steffen-winkler.de
Sun Mar 24 00:27:27 PDT 2019


Das ist schon mal eine Doppelt geschachtelte Schleife:

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

warum werden da array lengeh verglichen?

    sort { @$b[1] <=> @$a[1] }

Ich kenne aber auch die Aufgabenstellung nicht.

Vielleicht kann man auch nach Guttmann sortieren. Wenn es anwendbar ist, 
also man einen Sortierschlüssel erstellen kann, dann ist das noch 
schneller als Schwartz. Am besten man baut den Schlüssel schon beim 
einlesen.

Grüße von Steffen


Am 24.03.2019 um 01:01 schrieb Heiko Hartje:
> 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/
>
>
>


More information about the Leipzig-pm mailing list