Im Gegensatz zu Perl 5 führte Perl 6 optionale Typisierung sowie Einschränkungen ein, z. B .:
%Vor%Gab es Studien, die untersuchen, ob es Leistungseinbußen gibt und wie groß diese auf verschiedenen Perl 6-VMs sind, wenn diese Funktionen verwendet werden?
Ich bin auf der Suche nach etwas gut designed und Cross-VM.
Diese Antwort zielt darauf ab, @ donaldhs Antwort zu ergänzen, obwohl ich auch keine Forschung kenne, die für Perl 6-Typen / Typenbeschränkungen spezifisch ist.
Im folgenden wird vom Compiler zum Zeitpunkt der Kompilierung ein Complex ~~ Real
type-Test durchgeführt:
Beim Kompilieren des obigen Codes stellt der Rakudo-Compiler fest, dass number
ist Complex
- so erhalten Sie einen Kompilierzeit Typ Check-Fehler:
Im Laufe der Zeit können Perl 6-Compiler wie Rakudo ihre Compile-Time-Code-Analyse verbessern, was dazu führt, dass mehr Typprüfungen während der Kompilierung stattfinden, wie oben beschrieben.
Beachten Sie, dass die where
-Klausel nicht einmal ausprobiert wurde. Es gibt null Strafe für nur Angabe where
-Klauseln. Jeder Overhead aufgrund von where
-Klauseln wird nur angewendet, wenn eine Variable / ein Wert die grundlegenden Typprüfungen überschreitet.
Im folgenden überprüft der Compiler eine Complex ~~ Real
Typüberprüfung bei Laufzeit :
Beim Kompilieren des obigen Codes macht der Rakudo-Compiler not zur Zeit der Kompilierung, dass number
ist Complex
. Zur Laufzeit wird die erste multi sub
-Deklaration berücksichtigt und abgelehnt. Wie zuvor versucht es nicht einmal die where
-Klausel. Stattdessen wird stattdessen der zweite multi sub
erfolgreich aufgerufen.
Die bisherigen Beispiele sollten deutlich machen, dass es für die meisten Typprüfungen einen Leistungsabfall von null oder fast null gibt.
Theoretisch können native Typen für eine bessere Leistung verwendet werden:
%Vor%In der Praxis wird die Angabe eines nativen Typs manchmal langsamer.
Wenn sich die Rakudo-Optimierung verbessert, sollte die int
-Optimierung relativ zu Int
konsistenter und signifikanter werden. Eine ähnliche Geschichte gilt für andere native skalare Typen und für native Arrays.
Perl 6 unterstützt "Zwangstypen".
Zum Beispiel akzeptiert Str(Int)
Int
oder einen Subtyp davon und konvertiert zu Str
.
Wenn der innere Typ eines Zwangstyps übereinstimmt, wird der Compiler zusätzlich den Laufzeitaufwand für die Ausführung des Zwangskodes aufwenden.
where
-Klauseln Nach Abschluss der konventionellen statischen und dynamischen Typprüfung, wie oben beschrieben, werden alle anwendbaren where
-Klauseln aufgerufen, bis einer von ihnen erfolgreich ist oder alle von ihnen fehlschlagen.
Ein Compiler kann where
-Klauseln analysieren und erkennen, dass sie einem ausreichend einfachen statischen Ausdruck entsprechen (zB where Int | Str
) und diese Informationen verwenden, um den Laufzeitaufwand zu vermeiden, der durch das Ausführen von beliebigem Code entsteht. (Siehe @ Larrys Spekulationen über verwandte Themen .)
Der aktuelle Rakudo analysiert where
-Klauseln nicht. Tatsächlich ruft es where
-Klauseln öfter auf, als es unbedingt nötig ist.
Die Leistung ist eine Funktion bestimmter Compiler / Backends.
Der primäre Perl 6-Compiler für 2017 war Rakudo / MoarVM. Es gab in der Vergangenheit andere Compiler, die wesentliche Teilmengen von Perl 6 kompiliert haben und werden es sicherlich wieder geben ; diese können zusätzliche Daten liefern.
Perl 6 führte optionale Typisierung ein
Falls Sie sich entscheiden, im Internet nach verwandten Daten zu suchen ...
Perl 6 unterstützt Funktionen wie klassenbasierte Vererbung und Multi-Dispatch. Beide disqualifizieren Perl 6 von einem "Optional Typing" -System gemäß der Definition von
Wikipedia platziert stattdessen Perl 6 in der breiten Kategorie "Gradual Typing" und auch Larry Wall und doc.perl6. org.
Tags und Links performance perl6