IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Optimiser vos scripts [Débat]


Sujet :

Langage Perl

  1. #1
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut Optimiser vos scripts
    Quelles sont les méthodes que vous utilisez pour optimiser au maximum vos scripts!!!!
    Si vous avez des remarques, suggestions ou même liens internet vers des cours adéquats, tous les forumeurs pourraient en profiter 8) !!
    Allez, à vos clavier!!!!!

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Globalement pour optimiser, rien ne vaut un bon algorithme.
    Néanmoins, et surtout dans un langage aussi haut niveau que Perl, il y a un tas d'astuces qui permettent d'améliorer un peu la vitesse. Les pires perte de temps proviennent souvent de l'utilisation erronée des fonctionnalités avancées (un exemple qui me vient à l'esprit : utiliser sort() pour obtenir le max d'une liste).

    Exemples simples d'optimisation : utiliser les placeholders et garder une connexion permanente à une base de donnée, utiliser les diverses optimisations de sort() lorsque le bloc de comparaison est relativement compliqué, etc...

    Un très bon article (en anglais)

    --
    Jedaï

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    qu'entends tu par les placeholders ???

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    pas trop parlant ce thread .

    Personne n'a d'astuces pour optimiser ces scripts :

    - pas utiliser sort n'importe comment.
    Rq : La fonction sort est très rapide et utilise un algorithme de tri évolué ecrit complètement en C, néanmoins, elle ne manipule que des listes tenant entièrement en mémoire (vive ou swap). ainsi évitez le tri d'enormes fichiers necessitant des fichiers temporaires et pour ceci il est vivement conseillé d'utiliser le module File::Sort
    voici une doc de reference sur les tris en Perl.

    - attention à l'utilisation des carcteres speciaux suivant $&, $`, $' dans les regex, car tres lent.

    - utiliser les hash au max que des tableaux à plusieurs dimensions.
    Les tableaux associatifs sont optimisés pour trouver la valeur d'une clé très rapidement.

    - éviter qd c'est possible de faire des tonnes de boucles imbriquées

    - utiliser des regex

    - apparemment tr/0-9//; serait plus rapide que s/\d+//;

    - le moyen le plus rapide d'accéder à la valeur du dernier index d'un tableau :
    La valeur du dernier index d'un tableau est obtenue grâce à $#

    - l'utilisation de map peut s'averer aussi interessant en temps d'execution

    - optimisation page web

    - etc
    partagez vos astuces, decouvertes ou remarques qui pourraient aider tout le monde à améliorer et surtout optimiser son script.

    NB: Je tiens tout de même à spécifier qu'il est toujours primordial d'avoir un bon algo avant tout of course 8)

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Perso, je n'entend pas le terme "optimisation" de la même manière que vous apparemment.

    Dans mon boulot, le temps de traitement d'un script n'est pas d'une importance capitale et on ne chipote pas pour un script qui pourrait gagner 10 secondes en temps s'il était mieux organisé.

    Par contre, ce que j'entend par optimisation chez moi consiste à relire l'ensemble du code, une fois le script achevé, et d'essayer de regrouper différents blocs ensemble pour éviter les redondances ou les trop nombreuses boucles foreach faisant chacune un traitement spécial mais toutes sur les mêmes données.

    En clair, je code salement et passe la serpillère ensuite. Voilà mon optimisation.

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par Arioch
    Perso, je n'entend pas le terme "optimisation" de la même manière que vous apparemment.

    Dans mon boulot, le temps de traitement d'un script n'est pas d'une importance capitale et on ne chipote pas pour un script qui pourrait gagner 10 secondes en temps s'il était mieux organisé.

    Par contre, ce que j'entend par optimisation chez moi consiste à relire l'ensemble du code, une fois le script achevé, et d'essayer de regrouper différents blocs ensemble pour éviter les redondances ou les trop nombreuses boucles foreach faisant chacune un traitement spécial mais toutes sur les mêmes données.

    En clair, je code salement et passe la serpillère ensuite. Voilà mon optimisation.
    sacrée arioch , c'est clair que pour gagner 2s, c'est pas tres important. Mais bon, quand on est sur de gros projets et que les scripts tournent pendant des heures, 1heure ou plus de gagné n'est pas négligeable tout de même. Et puis, c'est toujours mieux de coder le plus proprement possible et garder de bonnes habitudes. A chacun sa façon de voir les choses!

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par djibril
    sacrée arioch
    J'avoue, j'ai été terre à terre en lisant le terme "optimisation" mais si vous ne comptez ne parler que de l'optimisation du temps, autant modifier le titre du post it !

    D'ailleurs, quand je relis mon camel book, on parle bien de plusieurs types d'optimisation... Pas seulement celui du temps...

    Ok je connais la sortie

    s/Arioch//;

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    si t'as une suggestion pour un meilleur titre, je suis preneur

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Le problème, dès que l'on parle d'optimisation, c'est qu'on a vite fait de dire des bétises, par exemple la phrase suivante est rarement vraie (les hashs ne sont pas aussi efficaces que les tableaux en général) :
    - utiliser les hash au max que des tableaux à plusieurs dimensions.
    Les tableaux associatifs sont optimisés pour trouver la valeur d'une clé très rapidement.
    On a souvent des a priori sur la vitesse de telle ou telle partie de son code, qui s'avèrent faux lorsqu'on passe au benchmark. Le premier conseil pour optimiser est donc plutôt d'utiliser un profiler pour détecter où le programme passe le plus de temps, puis de n'optimiser qu'en testant à chaque étape (avec un vrai benchmark pas juste une estimation) si on gagne vraiment du temps.
    Et bien sûr commencer par optimiser le code est une erreur fréquente du débutant : la première chose à faire c'est se demander si son algorithme est vraiment adapté, si les structures de données choisies sont les bonnes, etc...

    Ensuite si vraiment c'est encore trop lent, on peut consulter l'article dont j'ai donné le lien dans mon premier post : il est vraiment bien fait et intéressant.

    --
    Jedaï

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par djibril
    qu'entends tu par les placeholders ???
    Au lieu de faire une requête en concaténant explicitement ses parties, ce qui peut en plus poser des problèmes de "caractères spéciaux" dans les parties dynamiques, il vaut mieux mettre des "?" à la place des parties dynamiques puis faire la requète en passant en paramêtre les parties dynamiques : ainsi DBI se chargera d'éviter les problèmes de caractères, et si on utilise plusieurs fois la même requête avec des paramètres différents, il y a un certain nombre de bases de données pour lesquelles DBI peut optimiser cette opération. Double gain donc, sans perte de lisibilité.

    --
    Jedaï

  11. #11
    Membre régulier Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 108
    Points
    108
    Par défaut
    Pour moi optimiser un script, c'est avant tout faire des choix entre RAM ou processeur et cela dépend de la machine où va tourner le script...

    un exemple : la commande "sort" utilise beacoup de RAM donc peut faire swapper et planter un serveur.
    Donc on peut faire le choix d'utiliser le processeur en parcourant la liste plusieurs fois et permuter 2 à 2 les valeurs jusqu'au moment où l'on a parcouru la liste entière et qu'il n'y pas eu de changements..... cet algorithme est très long à s'exécuter mais peut trier des listes contenant des milliards de valeurs sans planter l'ordi....

    Mais bon, c'est pas plus mal quand le script est rapide.

    Je vais essayer le module dont parle djibril (File::Sort)....
    -------------------
    Ickou

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Un aspect très important de la question :
    Utilisez-vous des très gros ensemble de données ? Dans ce cas, il faut absolument considérer la possibilité d'utiliser le module PDL : ce module permet de stocker des données aussi efficacement que dans un tableau C et donne accès à des routines de manipulation de ces données ultra-rapides, autrement dit, il transforme Perl en langage crédible pour effectuer des très gros calculs et manipulation de données. (ce qu'il est déraisonnable de faire avec les structures de données normale de Perl : le coût en RAM et en indirections par objet devient très vite prohibitif lorsqu'on manipule des dizaines de millions de nombres. Par exemple les tableaux/listes Perl contiennent des **SV autrement dit, des pointeurs vers des pointeurs vers des scalaires, qui sont eux-même des structures de donnée complexe. La flexibilité que cela apporte est très grande et très utile, mais cela ne fait pas bon ménage avec les très gros besoins. PDL corrige ceci)

    --
    Jedaï

  13. #13
    Invité
    Invité(e)
    Par défaut
    Une page intéressante sur le sujet chez IBM http://www-128.ibm.com/developerwork...l-optperl.html

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Points : 142
    Points
    142
    Par défaut
    1. Eviter les `` et system(), mais préférer les commandes internes

    2. Si on peut éviter $1, $2, $3, ... au sein d'un script, le faire; sinon, les utiliser le plus souvent possible.

    3. Coding style:

    Keep
    It
    Simple
    Stupid

    + use strict
    + use warning
    + indentation correctes

    (ca peut paraitre bizzare, mais au mieux c'est codé, au moins c'est fouillis, et au mieux on voit ce qui peut poser problème)
    Michaël Hooreman

  15. #15
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Un bon code passe par un bon algorithme bien sûr mais passe aussi par une bonne utilisation des spécificités du langage que l'on utilise.

    Un exemple simple est l'utilisation de boucles foreach à la place de boucle for. Sans avoir fais de benchmark, je pense que pour le traitement élémént par élément d'un tableau (ou même mieux d'un hachage) la boucle foreach est plus performante (sinon elle n'aurait pas été inventée).
    Autre exemple, n'utiliser la POO que quand elle est vraiment utile car une utilisation abusive aboutie à une réduction d'éfficacité du code, contrairement à ce qu'il se passe en C++.

    Pour le reste, bah ça a déjà été dit hein
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par Woufeil
    Un exemple simple est l'utilisation de boucles foreach à la place de boucle for. Sans avoir fais de benchmark, je pense que pour le traitement élémént par élément d'un tableau (ou même mieux d'un hachage) la boucle foreach est plus performante (sinon elle n'aurait pas été inventée).
    Sans vouloir entrer dans la polémique, j'ai toujours cru (cfr camel book) que for et foreach étaient synonymes.
    Michaël Hooreman

  17. #17
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bah je pense pas non, la syntaxe est totalement différente et on peut pas utiliser un foreach à la place d'un for dans tous les cas (mais un for peut toujours remplacer un foreach il me semble).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #Boucle pour utiliser chaque élément d'un tableau avec for
    for (my $i=0;$i<$#tab;$i++)
    {#faire quelque chose avec $tab[$i]
    }
    #La même avec foreach
    foreach my $elem (@tab)
    {#faire quelque chose avec $elem
    }
    Je pense que si elle a été créée, c'est que la seconde boucle doit être plus optimisée que la première...
    D'ailleurs la documentation de Sylvain Lhuillier dit ceci :
    Cette instruction permet de parcourir une liste. Son implémentation optimisée dans l'interpréteur Perl rend son usage bien plus efficace qu'un parcours qui utiliserait une variable indicielle incrémentée à chaque tour d'une boucle for.
    Enfin, c'est mon avis en tout cas
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Bonsoir.

    Je pense comme mhooreman que for et foreach sont rigoureusement synonymes.

    Voyez cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #!/usr/bin/perl -w
     
     
    use utf8;
    use Tk;
    use warnings;
    use strict;
     
     
    my $mw = MainWindow->new;
     
     
    my @tableau = (10, 20, 30);
     
    my $somme = 0;
     
     
    foreach (my $i = 0; $i <= 2; ++$i) # Ceci montre qu'on peut mettre foreach là où on peut mettre for.
    {
      $somme += $tableau[$i];
    }
     
    $mw->messageBox(-message => $somme,);
     
     
    $somme = 0;
     
    for my $element (@tableau) # Ceci montre qu'on peut mettre for là où on peut mettre foreach.
    {
      $somme += $element;
    }
     
    $mw->messageBox(-message => $somme,);
    La première boucle (foreach), qui utilise un indiçage numérique, mérite les mêmes critiques qu'un for qui utiliserait lui aussi cet indiçage.

    La second boucle (for), qui n'utilise pas d'indiçage numérique, mérite les mêmes éloges qu'un foreach qui n'en utiliserait pas non plus.

  19. #19
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Après relecture du Camel Book, il me sembe que c'est effectivement le cas. Ca m'étonne beaucoup que Sylvain Lhuillier se soit trompé, mais cela semble être le cas...
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Woufeil
    Après relecture du Camel Book, il me sembe que c'est effectivement le cas. Ca m'étonne beaucoup que Sylvain Lhuillier se soit trompé, mais cela semble être le cas...
    Je ne sais pas si Sylvain Lhuillier s'est trompé : il n'en a pas à for ou à foreach, il critique l'indiçage numérique, et l'indiçage numérique est aussi critiquable avec foreach qu'avec for, je crois.

Discussions similaires

  1. [MySQL] Optimisation de scripts PHP/MySQL
    Par DgG dans le forum PHP & Base de données
    Réponses: 368
    Dernier message: 20/11/2013, 18h59
  2. Le temps d'exécution de vos scripts perl!!
    Par djibril dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2009, 10h42
  3. [Oracle] Optimisation de script
    Par johnkro dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 12/07/2006, 10h33
  4. [Débutant] Accélérer et optimiser ses scripts PHP
    Par Metallic-84s dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2006, 12h37
  5. [MySQL] [Script]Optimisation de scripts Php/MySQL (2)
    Par copy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/08/2004, 08h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo