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

Modules Perl Discussion :

lenteur des use dans .pm


Sujet :

Modules 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 : 498 771
    Points
    498 771
    Par défaut lenteur des use dans .pm
    Salut,
    J'ai un sript .pm dans lequels j'ai une vingtaines de procedures qui me depannent de temps e temps.
    Seulement dans ce .pm, j'utilise une vingtaine de modules, donc en debut de script j'ai une vigtaine de ligne avec use, mon .pm commence donc par ça :

    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
    #!/usr/bin/perl
    use strict;
    use Carp;
    use warnings;
    use toto;
    use titi;
    use pppp;
    ...
     
    sub proc1 {
    ...
    }
     
    sub proc2 {
    ...
    }
     
    sub proc2 {
    ...
    }
    si j'utilise ce module dans certains scripts, bah il prends toujours au minimum 3 à 4 secondes pour charger tous les modules utilisé par mon .pm.
    Pourtant, je n'ai pas forcement toujours besoins de tout.
    Comment faire pour optimiser ça.
    D'ailleur, si je fais juste perl mon_module.pm
    il ne retourne rien, ce qui est normal, mais il fait 3 à 4 secondes.
    y t il moyen de reduire ce temps?

    Merci

  2. #2
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Tu peux utiliser des 'require' des modules requis dans chaque fonction : ça diffère le chargement du module jusqu'à ce qu'on en ait besoin (et donc, si on ne s'en sert pas, on ne le charge pas et ... on ne perd pas de temps)

    Si le module est requis plusieurs fois, il n'est chargé qu'une seule fois.

    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
    package testuse;
    use lib '.';
     
    sub fn1
    {
    	require Module1;
    	return 0;	
    }
     
    sub fn2
    {
    	require Module1;
    	return 0;
    }
     
    1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package Module1;
     
    BEGIN
    {
    	my $strPackage = __PACKAGE__ ;
     
    	print "($strPackage) chargé\n";
    }
     
    "1";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    use lib '.';
    use testuse;
     
    &testuse::fn1;
    &testuse::fn2;
    Si tu supprimes dans le dernier code les appels à fn1 et fn2, tu verras que Module1 n'est pas chargé. Et si on laisse les 2 appels, on voit qu'il n'est chargé qu'une fois.

    Le seul souci que je voie est que des erreurs seront détectées à l'exécution plutôt qu'à la compilation.

    Jako

  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 : 498 771
    Points
    498 771
    Par défaut
    merci pour ta réponse et j'y avais pensé, mais il se peut qu'il y ait un hic et ça peut etre dangereux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    require Cwd;                # rends Cwd:: accessible
    $here = Cwd::getcwd();
     
    use Cwd;                    # importe les noms depuis Cwd::
    $here = getcwd();
     
    require Cwd;                # rends Cwd:: accessible
    $here = getcwd();           # oups ! y'a pas de  main::getcwd()
    En général, use Module () est recommandé a la place de require Module, car cela détermine si le module est la au moment de la compilation, pas en plein milieu de l'exécution de votre programme.
    Donc tout dépends du module qu'on utilise je pense. Certains permettent l'utilisation de methodes après création d'un objet et d'autres non (le cas de Cwd par exemple)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    Tu aussi peux utiliser import apres un require, pour arriver au meme resultat final qu'une use à runtime.
    En fait use n'est rien d'autre qu'un require et un import dans un bloc BEGIN.

    Pour ton problème de lenteur de chargement, cela peut etre du à un trop gros nombre de repertoires dans ton @INC : perl va les scanner linéairement à la recherche de chaque module usé. Pour peut qu'un des repertoires de @INC soit particulierement lent (genre repertoire samba), l'initialisation du module peut etre très ralentie.
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/04/2015, 22h18
  2. QGIS : lenteur pour afficher les listes des vues dans "Ajouter une table PostGIS"
    Par fafa63 dans le forum SIG : Système d'information Géographique
    Réponses: 2
    Dernier message: 11/07/2014, 19h04
  3. [CR9] lenteur mise en forme des couleurs dans expert diagram
    Par cdu dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 20/04/2005, 08h48
  4. Réponses: 2
    Dernier message: 31/08/2002, 14h00
  5. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 18h15

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