Seitenanfang

Perl vs. Moose vs. Mouse

Dieser Post wurde aus meiner alten WordPress-Installation importiert. Sollte es Darstellungsprobleme, falsche Links oder fehlende Bilder geben, bitte einfach hier einen Kommentar hinterlassen. Danke.


Seit nunmehr 23 Jahren entwickle ich Software. Zu meinen Anfangzeiten waren Ressourcen noch etwas, dass sehr schonen behandelt werden musste, ein Datapoint 6600 hatte gerade mal 64kB RAM und die mussten sich alle gleichzeitig laufenden Programme aller Benutzer auch noch teilen. Dagegen war der 86HC12 mit seinen 4kB Flash und 192 Byte RAM in Assembler programmiert geradezu luxuriös.

Auch wenn die Zeiten sind geändert haben und 99,995% aller Anwendugen auf jedem 5 Jahre alten Server problemlos laufen und auch ohne Datenbank-Indices und irgendwelche Optimierungen den Server nie ernsthaft belasten - es widerstrebt mir immer noch innerlich, Ressourcen sinnlos zu verschleudern. Genau an dieser Stelle kommt Moose ins Spiel. Es ist - und dafür akzeptiere ich auch alle Flames - überflüssig. Moose ist ein monströses Framework, dass unterm Strich nur eine neue Syntax für Perl etablieren möchte. Klar vereinfacht es die Programmierung möglicherweise etwas, allerdings sehe ich momentan eher das Gegenteil: Eine auf Perl aufbauende neue Programmiersprache.

Als ich mich mit den MongoDB-Schnittstellen befasst habe, musste ich feststellen, dass es mittlerweile auch Mouse gibt: Moose, nur schlanker und leichter. Um den Unterschied beurteilen zu können, habe ich einen Mini-Test gemacht, dabei ging es um Ladezeit und RAM-Verbrauch, mit folgendem Ergebnis:

LadezeitRAM-Verbrauch
perl -e 'system "ps u $$";'0,087s1508kB
perl -MMouse -e 'system "ps u $$";'0,217s3672kB
perl -MMoose -e 'system "ps u $$";'1,117s7580kB
Um gleiche Bedingungen zu schaffen, wurde nur der zweite Aufruf gewertet, da in der Praxis die notwendigen Dateien ohnehin im Cache liegen dürften.

Der RAM-Bedarf von Moose lag - auch wenn er beim fünffachen von "Plain Perl" liegt - niedriger als erwartet, allerdings ist mehr als eine Sekunde Ladezeit absolut indiskutabel. Padre braucht zum Starten und Beenden der kompletten IDE insgesamt nur 5,5 Sekunden.

Mouse dagegen liegt mit 0,2 Sekunden bei einem akzeptablen Wert. Ob man Moose nun als Notwendigkeit, die Antwort auf alle Fragen (obwohl - das ist eigentlich 42) oder ein Nice-to-have ansieht, mit Mouse gibt es eine Alternative die für Fans und Gegner gleichermaßen akzeptabel sein sollte.

PS: Ihr seit gerne eingeladen, mein Weltbild von Moose zu korrigieren, ein einfaches "Moose ist einfach besser" wird dazu aber nicht ausreichen.

 

5 Kommentare. Schreib was dazu

  1. Sid Burn

    Hmm,
    bei mir hat Moose (nicht Mouse) eine Ladezeit von 0.2 Sekunden (mit dem gleichen Befehl wie deinen). Nur das erste Laden dauert 1 Sekunde. Und der Rechner auf den ich das ausgeführt habe ist nicht gerade aktuell.


    Aber ansonsten ist Moose keine unnötige Verschwendung von Ressourcen. Die Primäre Ressource die du mit Moose einsparst ist deine eigene Zeit, die des Entwicklers. Was bringt es dir das doppelte oder dreifache an Zeit zu investieren wenn deine Applikation davon letztendlich 25MB anstatt 50MB Ressourcen benötigt. Auf ein Server der 8GB RAM oder mehr besitzt?


    Oder wenn würde es Interessieren wenn Padre 6.5 Sekunden zum laden brauchen würde anstatt 5.5 Sekunden? Ich meine das sind Applikationen die man einmal startet und dann laufen sie. Und man startet sie nicht ununterbrochen von neuem.


    Ansonsten Programmierst du doch auch nicht mehr in Assembler sondern wohl auch in Perl. Mit Assembler würdest du wohl noch schneller von der Performance her sein, und noch geringer deine Ressourcen sein. Und für eine Webapplikation die du in Perl vielleicht 1 Woche brauchst, sitzt du in Assembler vielleicht ein halbes Jahr und bist am ende weniger flexibel. Dazu kommen wohl noch fehlende Platformunabhängigkeit.


    Zum anderen zählt doch eher die Wartbarkeit einer Applikation. Und die steigt mit Moose doch enorm. Das Moose nur eine etwas neue Syntax wäre kann man so nicht hinnehmen. Moose ist schon eine enorme einsparung und bietet schon relativ viel. Weiterhin wenn du alles von Hand machst was Moose machst würdest du wohl keine Ressourcen einsparen.


    Der Unterschied zwischen Mouse und Moose liegt darin das Mouse kein Meta-Objekt hat. Bei Moose hast du zum beispiel die Möglichkeit zur Laufzeit abzufragen welche Attribute, Methoden etc. eine Klasse hat. Und du kannst das Meta-Objekt erweitern. Genauso die ursprüngliche Klasse. Gerade diese Technik wird von KiokuDB zum Beispiel genutzt. Über das Meta-Objekt können so die Daten einer Klasse abgefragt werden und KiokuDB ist in der Lage das Objekt automatisch zu Serialisieren und in einer Datenbank abzulegen. KiokuDB versteht sich hier als "ORM" zu NoSQL Datenbanken. Aber auch ohne Meta-Objekt und diese Möglichkeiten zu verwenden erspart einem Moose durch sehr viel Tipparbeit, und spart meine Wertvolle Ressource.

  2. Sebastian

    Testrechner: Samsung NC10 Netbook mit Intel Atom 1,6GHz (mein Entwicklungsrechner).

    In einem Punkt muss ich Dir widersprechen: Auch wenn Padre bei mir quasi-permanent (1 Task pro Projekt) läuft, wird er von vielen Anwendern auch anders benutzt, wie das Feedbeck auf die letzte "Entschlackung" des Startprozesses mit 2/3 Zeitersparnis gezeigt hat.

    Die extreme Zeitersparnis bei der Entwicklung sehe ich nicht, speziell mit Padre's intelligentem AutoComplete würde ich meine Entwicklungszeit auf 30-50% Tipp- und den Rest Denkarbeit einschätzen. Noch weniger Tippen zum Preis von noch mehr Komplexität und weniger Übersichtlichkeit sehe ich dabei nicht als Vorteil an, allerdings beurteile ich das Ganze aus theoretischer Sicher und Du - offensichtlich - als praktischer Anwender, insofern werde ich Dir in diesem Punkt erst wirklich widersprechen (können), wenn ich irgendwann die Zeit finde (oder dazu gezwungen werde), mich mit Moose im Detail auseinander zu setzen.

  3. Sid Burn

    Der Vorteil von Moose ist doch gerade eben die Komplexität zu reduzieren und die Übersichtlichkeit zu erhöhen, und nicht das umgekehrte. Das was ich in Moose in paar Zeilen schreibe bekommst du auch nicht durch eine Auto-Completion in Padre.


    Moose bietet dir Accessor zu generieren die eine Validierung haben. Du kannst einfach sagen welche Attribute Default Werte haben, ob diese Lazy berechnet werden (erst bei aufruf) ob diese bei einem ->new() aufruf benötigt werden. Du kannst Typen definieren. XYZ muss ein String, Nummer, Positiven integer, E-Mail, DateTime Objekt etc. sein. Inklusive Coercion das zum beispiel der Nutzer deines interfaces auch "2010-01-01 12:00:00" eintippen kann und Moose für dich den Wert in einem DateTime Objekt umwandelt.


    Moose hat ein eigenes System womit du deine eigene Typen integrierst die man nunmal in Applikationen besitzt. Durch Rollen kannst du ein Interface bestimmen, und Code zum beispiel Methoden die du öfters verwendest in Rollen auslagern die du in Klassen wiederrum laden kannst.


    Bei der Vererbung wird dir geholfen. Grundsätzlich macht Moose interessant da es schon sehr viele erweiterung im MooseX:: Bereich gibt oder eben in MooseX::Types::


    Moose macht wie gesagt sehr viel mehr was dir eine simple Syntax AutoCompletion von Padre nicht abnehmen kann. Und der Zweck ist es ja eben Übersichtlicher zu sein. Selbst wenn dir Padre noch etwas Tipparbeit abnimmt. Wenn du nur 5 Zeilen schreibst was in Pure Perl 50-100 Zeilen wären dann ist Pure Perl hier nicht ansatzweise übersichtlicher oder einfacher. Man schreibt Deklarativer und von Natur aus besser seine Komponenten das sie wiederverndbar sind. Wenn du Moose noch nicht genutzt hast dann wird es Zeit. Moose ist aber Grundsätzlich mehr als nur etwas Syntaktischer Zucker.

  4. xGhost

    Ich muss Sid Burn recht geben und zwar in allen Punkten. Erstens ist die Startgeschwindigkeit mit der neusten Moose Version total irrelevant. Zeitkritische Applikationen Programmiere ich in C++. Moose ist genial. Wenn man das 1-2 mal in Projekten eingesetzt hat, will man nie wieder ohne Moose Programmiere. Und zum glück wurde es in Perl6 integriert. Ich hoffe es werden noch mehr feature aus Moose nach perl6 in die Sprache standardisiert. Ein weiterer Vorteil ist, dass man nicht Zigtausend setter und getter variablen definieren muss und daruch die Lesbarkeit und Wartbarkeit um das vielfache verringert. Auch sind die Testscripte nicht mehr so gross weil jeder setter und getter getestet werden müssen. Wie auch immer, arbeite mal eine Zeitlang mit Moose und du wirst es lieben. Es gibt im foo-magazin auch gute Beispiele. Moose hat zudem eine ganz neue Objekt Variante erfunden "Rollen", total genial.

  5. Robert 'phaylon' Sedlacek

    Zitat aus der Mouse Dokumentation:


    "Please don't copy MooseX code to MouseX. If you need extensions, you really should upgrade to Moose."


    Mouse sieht aus wie Moose, ist es aber nicht. Was oft übersehen wird, ist dass Moose nicht mit Class-Accessor und dergleichen vereinbar ist. Wir haben in Perl einfach nichts anderes im Moment das diese Flexibilität bietet. Wenn ich vor einigen Jahren eine Klasse mit Attribut-Validierung, Delegation, lazy-loading und Laufzeiterweiterbarkeit haben wollte, war das schon einiger Aufwand. mit Moose muss ich nichtmal darüber nachdenken. Ich würde heutzutage keine Zeit (Resourcen) dafür verschwenden wollen.


    Und auch wenn Moose oberflächlich wie schlichte Klassendeklaration in "hübsch" wirkt, stecken hinter dem MOP viel mehr Möglichkeiten. Introspektion/Reflektion haben eine ganze Bandbreite von möglichen Anwendungsfällen über die vor Moose in Perl nichtmal nachgedacht wurde, weil sich niemand die Mühe gemacht hat. Abgesehen davon dass die Unmengen an Erweiterungen für Moose auf CPAN alle generell miteinander kompatibel sind, auch dank des MOP.


    Insofern finde ich Pure Perl, Moose und Mouse einfach nicht vergleichbar. Auf jeden Fall nicht mittels Startzeit. Ein Pferd ist zwar mit Heu zufrieden, und braucht kein Benzin. Aber ein Auto wird mich auf längere Strecke auf jeden Fall schneller ans Ziel bringen.

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>