GoGPT Best VPN GoSearch

OnWorks-Favicon

perl_performance – Online in der Cloud

Führen Sie perl_performance im kostenlosen Hosting-Anbieter OnWorks über Ubuntu Online, Fedora Online, den Windows-Online-Emulator oder den MAC OS-Online-Emulator aus

Dies ist der Befehl perl_performance, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann

PROGRAMM:

NAME/FUNKTION


makepp_perl_performance – Wie man Perl schneller macht

BESCHREIBUNG


Die größten Optimierungsgewinne werden in der Regel durch algorithmische Verbesserungen erzielt. Aber während diese
kann schwer zu finden sein, es gibt aber auch viel, was man mechanisch machen kann.

Makepp ist ein großes Hochleistungsprogramm, bei dem Geschwindigkeit ein Muss ist. Es wurden große Anstrengungen unternommen
daran, es zu optimieren. Dies dokumentiert einige allgemeine Dinge, die wir gefunden haben. Derzeit ist die
Konkrete Tests, die zu diesen Ergebnissen führten, wurden größtenteils verworfen, aber ich habe vor, dies zu tun
Fügen Sie sie nach und nach hinzu.

Wenn Sie überlegen, wie Sie makepp beschleunigen können (über die Perl-Programmierung hinaus, die Sie in Ihr Programm eingefügt haben).
makefiles), schauen Sie sich makepp_speedup an. Diese Seite ist nur völlig unabhängig von makepp
Ziel war es, unsere Ergebnisse der Perl-Community zur Verfügung zu stellen. Einige dieser Maßnahmen sind
gesunder Menschenverstand, aber manchmal vergisst man sie. Andere müssen messen, um ihnen zu glauben, also:

Messen, nicht erraten
Profilieren Sie Ihr Programm
Makepp wird mit einem Modul geliefert Profiler.pm in seinem CVS-Repository. Dies wird zunächst als ausgeführt
Programm auf einer Kopie(!) Ihres Codes, den es instrumentiert. Dann führen Sie Ihre Kopie aus und
Erhalten Sie konfigurierbare Statistiken pro Intervall und eine Endsumme für die häufigsten Intervalle
aufgerufene Funktionen und die meiste in Funktionen verbrachte Zeit (abzüglich Unteraufrufe). Beide sind
absolut und in Anrufer-Angerufenen-Paaren bereitgestellt. (Dokumentation im Lieferumfang enthalten.)

So erfahren Sie, welche Funktionen die vielversprechendsten Kandidaten für ein Tuning sind. Es auch
gibt Ihnen einen Hinweis, wo Ihr Algorithmus überraschenderweise falsch sein könnte
teure Funktionen oder durch überraschend häufige Anrufe.

Zeit für Ihre Lösung
Entweder einer von

perl -Mstrict -MBenchmark -we 'my ; timethis -10, sub { }'
Zeit perl -Mstrict -we 'my ; for( 0..999_999 ) { }'

Wenn es auf verschiedenen Codevarianten ausgeführt wird, die Ihnen einfallen, kann es zu überraschenden Ergebnissen kommen.
Selbst kleine Änderungen können viel bewirken. Achten Sie darauf, keinen Code zu „messen“, der dies kann
werden wegoptimiert, weil Sie das Ergebnis verwerfen oder weil es davon abhängt
Konstanten.

Abhängig von Ihrem System erfahren Sie hier in KB, wie fett Perl geworden ist:

perl -Mstrict -we ' ; System „ps -ovsz $$“‘

Nachfolgend zeigen wir nur den Code innerhalb der Option „-e“ als Einzeiler.

Regexps
Verwenden Sie einfache reguläre Ausdrücke
Mehrere Treffer kombiniert mit „||“ sind schneller als ein großes mit „|“.

Verwenden Sie vorkompilierte reguläre Ausdrücke
Anstatt Zeichenfolgen in reguläre Ausdrücke zu interpolieren (es sei denn, die Zeichenfolge ändert sich nie).
und Sie verwenden den Modifikator „o“), kompilieren Sie den regulären Ausdruck mit „qr//“ vor und interpolieren Sie ihn.

Verwenden (?:...)
Wenn Sie nicht verwenden, was mit der Gruppierung übereinstimmt, veranlassen Sie Perl nicht, es mit „(...)“ zu speichern.

Anker am Anfang der Zeichenfolge
Lassen Sie Perl nicht Ihre gesamte Zeichenfolge durchsuchen, wenn Sie nur eine Übereinstimmung wünschen
Anfang.

Ankern Sie nicht am Ende nach Gier
Wenn Sie ein „*“ oder „+“ haben, das bis zum Ende der Zeichenfolge passt, fügen Sie danach kein „$“ ein
es.

Verwenden Sie tr///
Dies ist doppelt so schnell wie s///, wenn es anwendbar ist.

Funktionen
Vermeiden Sie Objektorientierung
Die Suche nach dynamischen Methoden ist in jeder Sprache langsamer, und Perl kann dies aufgrund der lockeren Typisierung langsamer tun
Tun Sie es niemals zur Kompilierungszeit. Verwenden Sie es nicht, es sei denn, Sie benötigen die Vorteile
Polymorphismus durch Vererbung. Die folgenden Aufrufmethoden sind nach der langsamsten sortiert
zum schnellsten:

$o->method( ... ); # in der Klasse von $o und seiner @ISA gesucht
Class::method( $o, ... ); # statische Funktion, neuer Stapel
Class::method $o, ...; # Statische Funktion, neuer Stapel, zur Kompilierzeit überprüft
&Class::method; # Statische Funktion, Stapel wiederverwenden

Diese letzte Form ist immer möglich, wenn die Methode (oder normale Funktion) keine Argumente akzeptiert. Wenn
Es sind Argumente erforderlich. Achten Sie darauf, dass Sie nicht versehentlich optionale Argumente angeben
Einsen! Wenn Sie dieses Formular häufig verwenden, ist es am besten, das Minimum und das Maximum im Auge zu behalten
Anzahl der Argumente, die jede Funktion annehmen kann. Die Wiederverwendung eines Stapels mit zusätzlichen Argumenten ist
Kein Problem, sie werden ignoriert.

Stapel nicht ändern
Der folgende Fehler findet sich häufig sogar im Perl-Dokument:

mein $self = shift;

Sofern Sie keinen triftigen Grund dafür haben, verwenden Sie Folgendes:

my( $self, $x, $y, @z ) = @_;

Nutzen Sie wenige Funktionen und Module
Jede Funktion (und dazu gehören leider auch Konstanten) nimmt allein schon über 1 KB ein
Existenz. Da jedes Modul andere erfordert, von denen Sie die meisten nie benötigen
kann sich summieren. Ziehen Sie kein großes Modul ein, sondern ersetzen Sie einfach zwei Zeilen Perl-Code durch ein
einzelner, eleganter aussehender Funktionsaufruf.

Wenn Sie eine Funktion haben, die nur an einer Stelle aufgerufen wird, wären die beiden zusammen immer noch vorhanden
einigermaßen kurz, fügen Sie sie mit den entsprechenden Kommentaren zusammen.

Eine Funktion darf nicht nur eine andere mit denselben Argumenten aufrufen. Alias ​​es stattdessen:

*alias = \&function;

Gruppenaufrufe zum Ausdrucken
Einzelne Aufrufe von print oder print mit separaten Argumenten sind sehr teuer. Bauen
Speichern Sie die Zeichenfolge im Speicher und drucken Sie sie auf einmal aus. Wenn Sie mehr als 3 KB ansammeln können,
Syswrite ist effizienter.

perl -MBenchmark -we 'timethis -10, sub { print STDERR $_ for 1..5 }' 2>/dev/null
perl -MBenchmark -we 'timethis -10, sub { print STDERR 1..5 }' 2>/dev/null
perl -MBenchmark -we 'timethis -10, sub { my $str = ""; $str .= $_ für 1..5; print STDERR $str }' 2>/dev/null

Weitere Anwendungsbereiche
Vermeiden Sie Hashes
Perl wird mit vielen kleinen Hashes ziemlich langsam. Wenn Sie sie nicht benötigen, verwenden Sie etwas
anders. Die Objektorientierung funktioniert bei einem Array genauso gut, mit Ausnahme der Mitglieder
Auf den Namen kann nicht zugegriffen werden. Sie können jedoch numerische Konstanten verwenden, um die Mitglieder zu benennen.
Aus Gründen der Vergleichbarkeit verwenden wir hier einfache Zifferntasten:

mein $i = 0; unser %a = map +($i++, $_), "a".."j"; timethis -10, sub { $b = $a{int rand 10} }
unser @a = "a".."j"; timethis -10, sub { $b = $a[rand 10] }

mein $i = 0; my %a = map +($i++, $_), "a".."j"; timethis -10, sub { $b = $a{int rand 10} }
mein @a = "a".."j"; timethis -10, sub { $b = $a[rand 10] }

Verwenden Sie int-Schlüssel für Referenzsätze
Wenn Sie eine eindeutige Referenzdarstellung benötigen, z. B. für Set-Ops mit Hashes, verwenden Sie
Die ganzzahlige Form von refs ist dreimal so schnell wie die Verwendung der hübsch gedruckten Standardeinstellung
String-Darstellung. Vorsichtsmaßnahme: die HP/UX 64bitall-Variante von Perl, zumindest bis zu
5.8.8 hat eine fehlerhafte „int“-Funktion, bei der diese nicht zuverlässig funktioniert. Es gibt eine Hexform
ist immer noch ein gutes Stück schneller als Standardzeichenfolgen. Eigentlich geht es sogar noch schneller
als stringified int, abhängig von der Version oder Konfiguration von Perl. Ab
5.8.1 gibt es auch das äquivalente, aber hoffentlich zuverlässige Scalar::Util::refaddr

my @list = map { bless { $_ => 1 }, "someclass" } 0..9; my( %a, %b );
timethis -10, sub { $a{$_} = 1 for @list };
timethis -10, sub { $b{int()} = 1 for @list };
timethis -10, sub { $b{sprintf '%x', $_} = 1 for @list };
timethis -10, sub { $b{refaddr $_} = 1 for @list };

Es gibt auch sprintf '%p', das angeblich einen Zeiger ausgibt, aber abhängig davon, welchen
Ausdruck führt zur gleichen Referenz, Sie erhalten unterschiedliche Werte, es ist also nutzlos.

Vorsicht vor Saiten
Perl ist schrecklich, weil es Strings ständig kopiert, auch wenn Sie nie etwas ändern werden
ihnen. Dies verschwendet CPU und Speicher. Versuchen Sie dies zu vermeiden, wo immer es vernünftigerweise möglich ist.
Wenn die Zeichenfolge ein Funktionsparameter ist und die Funktion eine bescheidene Länge hat, kopieren Sie sie nicht
Kopieren Sie den String in eine „my“-Variable, greifen Sie mit $_[0] darauf zu und dokumentieren Sie die Funktion gut.
An anderer Stelle kann die Aliasing-Funktion von „for(each)“ hilfreich sein. Oder verwenden Sie einfach Verweise auf
Zeichenfolgen, die schnell kopiert werden können. Wenn Sie irgendwie sicherstellen, dass dieselben Zeichenfolgen gespeichert werden
Nur einmal können Sie einen numerischen Vergleich auf Gleichheit durchführen.

Vermeiden Sie Bitoperationen
Wenn Sie disjunkte Bitmuster haben, können Sie diese hinzufügen, anstatt sie zu verknüpfen. Verschiebung
kann meine Multiplikation oder Ganzzahldivision durchgeführt werden. Nur das niedrigste beibehalten
Bits können mit Modulo erreicht werden.

Separate boolesche Hash-Mitglieder sind schneller, als alles mit in eine Ganzzahl zu stopfen
Bit-Operationen oder in einen String mit „vec“.

Verwenden Sie die Reihenfolge der booleschen Operationen
Wenn es Ihnen nur darum geht, ob ein Ausdruck wahr oder falsch ist, schauen Sie sich die billigen Dinge an, z
boolesche Variablen zuerst und Aufruffunktionen zuletzt.

Verwenden Sie undef anstelle von 0
Es benötigt ein paar Prozent weniger Speicher, zumindest als Hash- oder Listenwerte. Du kannst immernoch
Fragen Sie es als booleschen Wert ab.

mein %x; $x{$_} = 0 für 0..999_999; System „ps -ovsz $$“
mein %x; undef $x{$_} für 0..999_999; System „ps -ovsz $$“

mein @x = (0) x 999_999; System „ps -ovsz $$“
mein @x = (undef) x 999_999; System „ps -ovsz $$“

Wählen Sie für oder Karte
Diese sind definitiv nicht gleichwertig. Abhängig von Ihrer Verwendung (d. h. der Liste und der
Abhängig von der Komplexität Ihres Codes kann das eine oder das andere schneller sein.

mein @l = 0..99;
for( 0..99_999 ) { map $a = " $_ ", @l }
for( 0..99_999 ) { map $a = " $_ ", 0..99 }
for( 0..99_999 ) { $a = " $_ " für @l }
for( 0..99_999 ) { $a = " $_ " für 0..99 }

Kein Alias ​​für $_ verwenden
Es ist zwar praktisch, aber ziemlich teuer, selbst das Kopieren vernünftiger Zeichenfolgen ist es
Schneller. Das letzte Beispiel ist doppelt so schnell wie das erste „for“.

mein $x = "abcdefg"; mein $b = 0;
for( "$x" ) { $b = 1 - $b if /g/ } # Kopieren nur bei Änderung erforderlich.
for( $x ) { $b = 1 - $b if /g/ }
lokal *_ = \$x; $b = 1 - $b if /g/;
lokal $_ = $x; $b = 1 - $b if /g/; # Kopieren günstiger als Alias.
mein $y = $x; $b = 1 - $b if $y =~ /g/;

Nutzen Sie perl_performance online über die Dienste von onworks.net


Kostenlose Server & Workstations

Laden Sie Windows- und Linux-Apps herunter

Linux-Befehle

Ad




×
Werbung
❤ ️Hier einkaufen, buchen oder kaufen – kostenlos, damit die Dienste kostenlos bleiben.