Ich frage mich, zeigt -MO=Deparse
Ihnen alle Perl-Optimierungen und warum wird das nicht in Perl 5.10 gefalzt?
Einige im IRC dachten, dass O=Deparse
nicht alles zeigt, aber es zeigt sicherlich eine konstante Faltung.
Gleiches Ergebnis, wenn ich explizit das Konstantensub schreibe. Obwohl es vorhersagbar ist, ist es auch ziemlich interessant, dass Sie in der Dokumentation in constant.pm
eine Konstantenliste anstelle eines Konstantenarrays erstellen. Ich nehme an, dass dies nicht nur wie skalare Konstanten gefaltet ist, sondern auch den Aufwand, ein neues Array bei jedem Aufruf zu erstellen.
Die einzige Schlussfolgerung, zu der ich kommen kann, ist -MO=Deparse
zeigt die gesamte Faltung, und konstante Arrays sind einfach nicht in Perl optimiert? Ist das so? Gibt es einen technischen Grund dafür?
Sie können keine konstanten Arrays erstellen, da Arrays keine Daten sind. Perl 5 hat fünf Arten von Daten (Dinge, die in Variablen gespeichert werden können):
Sie können aus jedem eine Konstante machen. Perl 5 hat auch drei Container:
Skalare können einen der ersten vier Datentypen enthalten, Arrays und Hashes können Listen enthalten. Es ist wichtig, Dinge nicht zu verwechseln, die Daten und die Daten selbst enthalten.
Wie bei B::Deparse
wird der optree nach der Erstellung des Dumps ausgegeben, damit die Ergebnisse angezeigt werden von allen konstanten Falten.
Ich habe noch nicht genug darüber nachgedacht, aber ich sehe keine offensichtlichen Gründe dafür, dass es nicht gefaltet werden könnte.
Sie können in Perl kein konstantes Array erstellen, es gibt nichts in den Interna, um ein konstantes Array oder Hash oder sogar einen Skalar anzugeben. "use constant" nutzt Perls Fähigkeit, Unterroutinen mit einem Prototyp von ()
und einfachem Code zu inline zu schreiben. Das Beste, was Sie tun können, ist das Flag readonly , das zur Laufzeit ausgeschaltet werden kann.
Perl könnte das Readonly-Flag zur Kompilierzeit als einen Hinweis verwenden, um anzuzeigen, dass das Array tatsächlich nur gelesen wird, und dann jeden Zugriff unter Verwendung eines konstanten Index inline. Eine solche Heuristik wäre wahrscheinlich sicher, da das Readonly-Flag nicht für Benutzer zugänglich sein sollte und Sie es wahrscheinlich nicht ausschalten sollten.
Tags und Links perl compiler-optimization constants perl5.10