11
votes

Moose est-il vraiment ce lent?

J'ai récemment téléchargé Moose. Expérimentalement, j'ai réécrit un module existant à Moose. Cela semble être un moyen pratique d'éviter d'écrire beaucoup de code répétitif. J'ai couru les tests du module et j'ai remarqué que c'était un peu retardé. J'ai profilé le code avec -D: DProf et il semble que juste inclure la ligne xxx

dans le code augmente l'heure de fonctionnement d'environ 0,25 seconde (sur mon ordinateur). Est-ce typique? Est-ce que je fais quelque chose de mal, ai-je désinstallé, ou devrions-nous vraiment nous attendre à ce retard?


12 commentaires

0,25 seconde. Une fois que. C'est la fin du monde! Courir!


0,25 seconde est un délai remarquablement long pour un programme informatique pour passer l'initialisation, Hobbs.


Lorsqu'il est regroupé avec le chargement des configurations à partir de fichiers et de db, configurez des interfaces réseau, etc., ce n'est pas vraiment significatif, si votre programme va fonctionner pendant de nombreuses heures ou plusieurs jours, comme une application Web.


Mon programme est une application Web, mais il ne va pas fonctionner pendant de nombreuses heures ou plusieurs jours, il sera exécuté une fois par demande. Le retard de 0,25 est une carence grave pour cela. Pourquoi tout le monde est-il si défensif, au fait? Tout ce qui est arrivé à "répondre à la question"? La question est, devrais-je m'attendre à ce retard ou fais-je quelque chose de mal? Il semble que la réponse soit «Oui, vous devez vous attendre à ce retard».


@ETher: cette pénalité ne serait-elle pas particulièrement importante dans le cas d'une application Web? Cela va être frappé avec une pénalité ¼ deuxième pour chaque demande qui gère.


Kino: En un mot, la réponse est "oui", mais la réponse plus longue est "mais il y a plusieurs façons autour de cela".


@Intuit: c'est l'un des grands avantages de l'utilisation de mod_perl.


@Ether personne dans le bon esprit n'utilise mod_perl pour les applications Web ... Il est d'étendre Apache avec Perl, ce qui ne construise pas de sites Web. Utilisez FCGI.


@Évan: personnellement, je construis des sites Web en prolongeant Apache avec Perl, mais YMMV :)


Je ne peux pas croire que j'ai suscité la CE. Mais sérieusement, FastCGI est l'option la plus sane. Les sites Web d'écriture dans mod_perl ont des implications sérieuses de portabilité.


Les sites Web d'écriture avec mod_perl ont des implications graves de la folie. Ces jours de plâtre sont la voie à suivre.


Absolument. Je jure que ce n'était pas moi n'écrivais pas ces commentaires sur mod_perl, honnête !!!!!! 111 !!! oneonone :) Pour clarifier - c'est l'un des avantages de tout webwork qui démarre Et puis reste de temps à maintenir de nombreuses demandes. Mod_perl est pas la meilleure option ici - Mojolicious, catalyseur et danseur sont tous meilleurs choix et tous courir sur le cadre de placach / PSGI qui est beaucoup plus sain d'esprit que mod_perl.


3 Réponses :


6
votes

Votre question est un peu trompeuse. Oui, Moose a un coût de démarrage mesurable, mais n'est pas lent après cela. Si le coût de démarrage est prohibitif, vous pouvez toujours démonter votre application.


15 commentaires

Pourquoi est-ce trompeur? Je n'avais aucune idée d'orignal était là-bas jusqu'à hier, et j'étais assez surpris par là.


En outre, dans ce cas, je ne peux pas démonter mon application et cela apporterait une foule de considérations telles que la gestion de la mémoire et du fichier.


@Kinopiko, YSTH affirme que le terme lent invoque à peine les coûts "compilé" ... Vous ne diriez pas qu'une KDE 4 est lente car il faut 9 heures pour compiler. Et, vous ne diriez pas que Linux est lent à cause du temps pour courir des scripts init ... Je ne suis pas d'accord avec YSTH, j'explique simplement ce que je crois que son argument.


@Kinopiko: Si vous regardez la source de Moose :: Meta :: Classe, Classe :: Mop :: Classe, Moose :: Meta :: Attribute et classe :: Mop :: Attribute Vous ne serez pas surpris :)


Vous l'avez dit à nouveau: "Moose [est] lent" ... * Vous savez que vous voulez dire que vous voulez dire un temps de démarrage, mais que quelqu'un d'autre ne sera pas à moins que vous ne clarifiez.


Voir par exemple la réponse de l'éther où il / elle vous donne des conseils qui rendront l'orignal plus rapidement au détriment du plus long démarrage.


Mais je ne veux vraiment pas dire temps de démarrage. Mon programme entier prend environ 0,02 seconde pour fonctionner à l'achèvement (c'est-à-dire terminer ce qu'il fait et sortir). Par conséquent, 0,25 seconde est beaucoup.


@Kinopiko - Vous parlez toujours de temps de démarrage (heure de compilation) et l'analogie est toujours vraie: il faut 9 heures pour compiler KDE même si vous souhaitez simplement aller sur Konsole et découvrir la version du noyau, qui ne fait pas Kde lent ... bien que vous discutez ici que cela est valable de dire kde est lent et de partir si tout ce que vous voulez, est à la version du noyau sur une nouvelle installation sur une nouvelle installation , à part ne pas vraiment avoir beaucoup à voir avec lent, c'est à peine le cas d'utilisation normal pour KDE de toute façon.


Avec Perl, il n'est pas possible d'exécuter un programme sans la compiler, c'est donc une mauvaise analogie.


Je dois me demander pourquoi vous utilisez OO du tout pour ce qui sonne comme un problème très procédural. :)


@Kinopiko: Je ne pense pas qu'il y ait du tout de déception. C'est bien connu et dans les docs que Moose a un hit de startup.


@Ashley: Où ai-je dit qu'il y avait une déception?


Je a dit qu'il y avait une tromperie, dans cette question de phrasé, pas dans les documents de Moose.


Je pense que la vraie question est "à quelle vitesse est l'orignal?" Et si cela est assez rapide pour une application spécifique ... Il n'y a aucune raison d'être défensive: les personnes présentant de grandes applications doivent savoir à quelle vitesse leurs outils.


@Solobold: Vous manquez le point. "À quelle vitesse est l'orignal" peut signifier deux choses très différentes et avoir des réponses différentes. Ce n'est pas défensif, cela essaie d'aider les gens à l'information dont ils ont besoin.



20
votes

Oui, il y a un peu de pénalité pour utiliser Moose. Cependant, ce n'est qu'une pénalité de démarrage, pas au moment de l'exécution; Si vous avez tout écrit correctement, les choses seront assez rapides au moment de l'exécution.

Avez-vous également inclus cette ligne: xxx

dans toutes vos classes lorsque vous non Moose; ? Appeler cette méthode le fera (runtime) plus rapidement (au détriment du temps de démarrage). En particulier, la construction d'objets et la destruction sont efficacement "inline" dans votre classe et invoquent plus la Meta API. Il est fortement recommandé de rendre vos cours immuables. Il rend votre code beaucoup plus rapide, avec un petit coût de compilation. Cela sera particulièrement perceptible lors de la création de nombreux objets. 1 2

Cependant, ce coût est encore trop. Si vous utilisez Moose à l'intérieur d'un script ou d'une autre manière où le temps de compilation est une fraction importante de votre temps d'utilisation globale, essayez de faire s / moose / moo / g - si vous ne faites pas Utilisez des modules Moosex, vous pouvez passer à Moo , dont le but est d'être plus rapide (au démarrage ) Tout en conservant 90% de la flexibilité de l'orignal.

puisque vous travaillez avec une application Web, avez-vous envisagé d'utiliser PLACK / PSGI?

< / sup> de la DOCS de make_imrutable, à Moose :: Cookbook :: Basics :: Recette7
2 Voir aussi l'article de Stevan Little Little: Pourquoi make_imutable est recommandé pour les classes de Moose


12 commentaires

Ether, j'ai supprimé toutes les autres trucs de l'orignal et j'ai juste oublié de supprimer la dernière ligne "Pas d'orose" et encore ce retard de 0,25 seconde. Quant à la souris, combien est-il plus rapide?


Parfois beaucoup plus rapide. Il y a rarement une bonne raison de pas rendre vos cours immuables (c'est l'une de ces choses où vous ne devriez le faire que si vous savez pourquoi et comprendre les inconvénients et les ramifications.)


$ TIME PERL -MOOSE -E'HAS QW / FOO ISA INT est RW /; __Package __-> Meta-> make_imutable si @Argv; push @_, classe-> nouvelle pour 1..100_000; Imprimer Scalar @_ ', puis exécutez la même chose simplement ajouter un 1 comme argument. Vous pouvez UTILISER BENCHMARK (.PM) , mais parfois, il n'est même pas proche.


Etather: L'objectif de la souris est de fournir des temps de démarrage plus rapides, de ne pas "être plus rapide". Un objectif secondaire (lié!) Est d'avoir moins de dépendances.


ERR, et make_imutable Will Aiui faire de la startup plus lent pas plus rapide.


@ysth; toujours; Je vais modifier pour en faire plus clair. immutabilité == Démarrage plus lent mais runtime plus rapide; Souris == Startup plus rapide, mais moins de flexibilité.


L'objectif initial de la souris était en fait d'enseigner à Sarttak comment écrire un protocole de méta. Deuxièmement, il s'agissait d'un faible orignal de Dep sans toutes les frais généraux "méta". SARTAK a ensuite constaté que le "méta" était la partie puissante de Moose et s'est déplacée et que quelqu'un d'autre a pris la souris.


Il existe certains modules de Mousex pour correspondre aux modules Moosex et certains modules Moosex peuvent être utilisés avec la souris lorsque vous le combinez avec n'importe quel :: Moose. Il convient également de noter que non seulement la souris est plus rapide du démarrage que l'orignal, il utilise moins de mémoire. Une partie de la vitesse de la souris provient de cela partiellement implémentée dans XS (quelque chose que nous attendons toujours de Moose)


@MKV: Une partie de l'orignal et la classe :: MOP est en XS.


Ether: Ouais, mais c'est principalement pour des raisons de magie, pas de performance


Les conseils sur la souris sont obsolètes. Utilisez Mooo à la place pour des trucs sensibles au temps de démarrage.


@Singingfish Oui, Moo est la voie à suivre! J'ai édité ma réponse.



12
votes

6 commentaires

+1 Voici comment j'ai écrit des prototypes ou de petites applications Web depuis quelques années (sauf S / Danseur / Squatting /). Ajoutez un proxy inverse ( en.wikipedia.org/wiki/Reverse_proxy ) et n'ai jamais besoin de vous inquiéter à propos de cgi à nouveau :)


@Sinan - Pourriez-vous clarifier la dernière ligne? Était-ce juste une blague ou une étincelle de sagesse ressemblant à Yoda que je ne suis tout simplement pas grokking?


"L'utilisation de Moose tire dans beaucoup de choses qui doivent être compilées" semble trompeuse. L'orignal est plus lent pour commencer à cause de ses éléments de méta-construction / introspection / crochet, pas parce qu'il compile le code. Beaucoup de modules dans une utilisation commune avec CGI.PM compilent autant ou encore plus de code.


@DVK devra expliquer un autre moment, mais ce n'est pas une certaine Yoda comme la sagesse.


@Sinan hors de curiosité, que considérez-vous comme matériel modéré? La chose de sommeil est une blague, non? :)


Enlevé Référence à Dormez dans les scripts CGI.