Bonsoir,
Un bon départ pour l'optimisation des scripts Perl c'est de lire et d'appliquer ce qu'on trouve dans
Programmation en Perl, Editions O'Reilly le chapitre 24 - Techniques couramment employées - Efficacité
lami20j
Version imprimable
Bonsoir,
Un bon départ pour l'optimisation des scripts Perl c'est de lire et d'appliquer ce qu'on trouve dans
Programmation en Perl, Editions O'Reilly le chapitre 24 - Techniques couramment employées - Efficacité
lami20j
Je travaille en sécurité et nous développons beaucoup en Perl à mon grand regret, du moins au début!!!
Je me suis rendu compte de la puissance du langage au fur et à mesure de son utilisation.
Dernièrement, nous avons débuter l'utilisation "d'objet" en Perl et nous avons obtenu de la performance et de la maintenance de code hors pair! Nous travaillons notamment constamment avec des objets AD et IIS. Cela nous a permis d'optimiser tous nos scripts et de développer des modules communs.
Je vous conseille donc de ne pas hésiter si vous avez la chance et des travaux plus complexe à faire, utiliser des objets! C'est très simple à programmer et pour quelqu'un qui vient de langage comme Java et .Net, c'est vraiment plaisant de sortir du monde script "pur"!!!
Ah, enfin quelqu'un qui ne critique pas le modèle objet de Perl, voilà qui fait plaisir !Citation:
Envoyé par lxmathx
Je voudrais juste rajouter que dans certains cas très rare, les objets oeuvent se réveler assez lent en Perl, mais qu'en général, ils aident à la clarification, à la maintenabilité, à la possibilité d'extension et à la réutlisabilité du code, sans que cela se ressente niveu performance.
N'hésitez donc pas à les utiliser comme dit lxmathx ;)
l'arme ultime (et trop méconnue) pour les objets en perl : enum::fields
http://search.cpan.org/~dmlloyd/enum-fields/
Pour optimier mes scripts , je commence déjà avant de coder a poser noir sur blanc ce que doit fait mon progo, ensuite je réfléchie a comment il vas devoir faire (les fonctions a coder etc...), puis seulement je code biensur quand une partie d'un script demande de faire du code redondant :? , je me réfléchie a comment faire en sorte de ne pas avoir ce problème en faisant tout simplement cela par exemple :
Code:
1
2
3
4
5
6
7
8
9 DEBUT SI VAR > 0 SI TOTO > 0 Traitement :-> blablabla :-> blablabla SINON Traitement :-> vive develloppez.com :mrgreen:
Tout cela me permet du faire du code pas trop mal 8-)
Citation:
Envoyé par pospos
8O 8O 8O ce truc est génial :lol: :lol: :lol: chui amoureux :ave: :yaisse2: c'est la fete du slip :aie:
Bonsoir,
Ça semble tout bête mais on peut aussi penser à utiliser le profiler
perl -d:DProf prog.pl
puis
dprofpp tmon.out
Ça permet de savoir où on passe du temps et quelles sont les fontions les plus appelées (et donc qu'il vaut mieux optimiser).
Parmi mes optimisations ou habitudes, pour la vitesse :
- Si j'ai besoin plusieurs fois d'une valeur 'un peu compliquée (coûteuse) à obtenir' - par exemple la valeur associée à une clef dans un hachage - je la mets dans une variable que je réutilise ensuite.
- J'évite de passer en paramètre à un sub des 'grosses' variables, je passe plutôt leur référence. Ça doit éviter un recopie.
- J'utilise les regex seulement si j'en ai vraiment besoin
Pour la maintenabilité, lisibilité :
- J'évite au maximum les variables par défaut
- J'évite les écritures typiquement Perl du genre print 'Coucou' if $condition (c'est aussi parce que je pratique aussi le C/C++, le VB et autres langages ne permettant pas ceci)
- J'utilise bien sur les use strict et use warnings;
- Dans un sub, je récupère les paramètres dès le début
- Bien entendu, j'essaie de mettre un maximum de commentaires, intelligents si possible, et de les maintenir à jour (parce que pour s'embrouiller, un commentaire pas à jour, c'est top :-)
- J'essaie d'utiliser perldity pour soigner la présentation et la normaliser autant que possible
- J'évite d'abuser des goto sauf pour sauter à l'épilogue d'un sub où je fais le 'ménage' si besoin est (fermeture de fichiers par exemple). Ceci est particulièrement utilise si plusieurs sorties sont possibles au cours du déroulement d'une fonction, particulièrement en cas d'erreur.
- Si j'ai besoin de faire plus de deux fois la même chose, j'en fais un sub
- J'évite d'écrire des choses trop compliquées; je veux dire par là, je préfère écrire en deux ou trois lignes claires, en utilisant si besoin est des variables intermédaires dont on pourrait peut-être se passer, ce qui pourrait tenir en une seule ligne absonse; au début, ça amuse, mais quand on revient dessus trois ans après, ça calme...
- J'essaie de prendre en compte TOUTES les possibilités d'erreur, même celles qui ne devraient pas arriver... Par exemple, il arrive qu'une écriture dans un fichier ouvert correctement échoue (parce que le disque est plein par exemple, ou que le réseau a un problème), on ne le teste pas toujours... jusqu'au jour où on cherche pendant des heures d'où vient l'erreur...
- J'essaie de nommer pas trop betement les variables, par exemple $strLine est une chaine, $iNbEntries est un entier (représentant par exemple le nombre d'entrées d'un tableau), $iNoEntry serait l'indice si on parcourait un tableau, ...
- Dans la même logique, j'évite les variables globales dans la mesure du possible, et je les préfixe par g_ (g comme global)
Mais bien entendu, comme tout le monde, je fais aussi des choses pas belles :-)
Perso pour optimiser mes scripts je passe déjà par une phase de conception avant de commencer a coder.
Je rédige sous word ( pour les gros dev ) un cahier des charges, ensuite je cherche les meilleurs solutions techniques , puis je modélise sous visio et je fait un checkup complet pour être sur que tout est ok !
Ensuite seulement je code, et quand je galère je vais sur developpez :mrgreen: :king: .
Sa me permet de faire du code propre et fonctionnel biensur quand je trouve que mon code traine je me penche sur les optimisations par exemple au niveau des regxp pour le traitement de gros fichiers etc...
Je te conseille aussi l'utilisation de use diagnostics; 8-)Citation:
Envoyé par JakoJako
J'ajouterai au niveau des optimisations l'utilisation des fonctions interne de perl pas besoin de reinventer la roue 8-)
Bjr,
j'ai pû lire un peu la page 1 de ce Forum, et je me permet de données mon idée générale, et je vais comparer les deux approches, entre optimisation du Temps ou optimisation du code même.
je vais le comparer du coté footbalistique,
- si on a un bon joueur de foot, qui es techniquement fort, mais qui n'a pas le souffle pour terminer les 90 minutes, pour ne pas dire les 120 minutes, effectivement l'entraineur comptes sur lui s'il ne trouve pas celui qui termine les 120 minutes,
- si on a un joueur TGV en 4 poumons, on vas le remarquer tout autour du match, et sur toutes les actions, mais en maîtrise technique, ce dernier présente qlq défauts, et sa sera un paralyse pour lui, et dans ce cas, l'entraineur, même les supporteurs aiment bien être animé dans un match avec les actions techniques, driblage, petit pont .... je peux vous assurer que ce joueur sera sifflé d temps en temps
Le bon joueur, démarre par les techniques basiques, le plus que possible, peut être il sera diminué physiquement, mais avec le temps, les révisions des entrainement, il vas atteindre le sommet d'un Footballeur, et il sera le joueur ideal,
en gros, et pour relier tout, pour démarrer un bon Script Perl, faut avancée en parallèle, dans la tête, on a déjà la structure général et on peut même compiler virtuellement, c'est a dire c'est déjà un début,
l'avancement du code dois obligatoirement correcte, ne pas mettre n'importe koi qui coupe le souffre au processeur de passer sur une route RAM afin de trouve un parking ou pointer temporairement, on dois des le début mettre une bonne instruction au bon endroit, et si on save déjà faire la différence de rapidité, sa sera plus bénéfique, c'est a dire de pêcher les deux oiseaux en une seule pierre : Temps et code,
ce qui nous laisse dire que celui la est plus rentable que l'autre, et c'est ca, les choses évolue, même nos scervaux évolue, alors pkoi pas pensé a evoluer nos programme Perl.
Voila,
Un autre aspect, peut être dérisoire, de l'optimisation du code. Y a t-il des méthodes plus rapides que d'autres ?
Comme par exemple :
Est-il un mieux/plus rapide/préférable d'utiliser des doubles quottes ou des simples?
Est-il préférable d'utiliser la post-incrémentation plutôt que la pré-incrémentation ?Citation:
Préférez toujours les simples quotes. Lors de l'utilisation de doubles, perl va chercher s'il y a du code à modifier comme une variable par exemple.
Une boucle while est-elle plus judicieuse qu'une boucle for (dans le cas où on peut faire la même opération avec les deux) ?
... d'autres techniques peut être ?
Je demande ça car en PHP ce sont des détails qui ont leur mot à dire sur la plan optimisation de code.
:D
Citation:
$ perl -d:DProf -e 'sub a { for ($i = 0; $i < 100000 ; $i++) { } };sub b { $i = 0;while ($i < 100000) { $i++; } } do { a();b() } foreach 1 .. 1000' && dprofpp -I
Total Elapsed Time = 23.54639 Seconds
User+System Time = 23.26639 Seconds
Inclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
50.5 11.76 11.760 1000 0.0118 0.0118 main::a
49.6 11.54 11.545 1000 0.0115 0.0115 main::b
Rien de bien flagrant je dirais !Citation:
$ perl -d:DProf -e 'sub a { $i++ foreach 1 .. 1000000; };sub b { ++$i foreach 1 .. 1000000; } do { a();b() } foreach 1 .. 10' && dprofpp -I
Total Elapsed Time = 2.163905 Seconds
User+System Time = 2.171905 Seconds
Inclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
51.7 1.123 1.123 10 0.1123 0.1123 main::b
47.6 1.034 1.034 10 0.1034 0.1034 main::a
Ça va ouai ! Merci pour les tests, je garde ces lignes de côté ;)