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 :

Regex et lenteur [perl6]


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut Regex et lenteur
    Bonjour,

    Voici un petit code qui me parait bien lent. Je cherche simplement des TODO dans un fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/env perl6
    use v6;
    for "org-mode-gtk.raku".IO.lines {
        say $_ if $_ ~~ /(.*?)" # TODO "(.*)/;
    }
    Il met une seconde à traiter le fichier https://github.com/alainbebe/org-mod...-mode-gtk.raku d'à peine 850 lignes.
    Bon, je travaille sur un portable vieux de 3 ans ... mais quand même.
    Je sais qu'il y a des expressions gourmandes et pas, du backtracking. Faut-il écrire cela autrement ?

    Merci pour vos conseils.

    ABB

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Si ton but est juste d'afficher la ligne où se trouve un # TODO autant ne pas s'encombrer de fioritures:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for "org-mode-gtk.raku".IO.lines {
        say $_ if $_ ~~ /" # TODO "/;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for "org-mode-gtk.raku".IO.lines {
        .say if /" # TODO "/;
    }
    seront imbattables. Dans le cas d'une pattern commençant par une chaîne littérale, les positions susceptibles de réussir sont recherchées à l'avance par un algorithme rapide avant même la mise en branle du moteur de regex, et donc la pattern ne sera testée qu'à ces positions. Idem si avant la chaîne littérale il y a seulement .*? ou .*, la même optimisation se produira. Par contre, le simple fait de placer .*? dans un groupe, fera que l'analyse de ta pattern en vue de cette optimisation sera abandonnée (il ne faudrait pas que cette analyse en vue d'optimiser la pattern dure trop longtemps, c'est pour cette raison qu'elle reste très basique).

    Si par contre tu souhaites capturer des choses dans la ligne et que tu dois commencer la description dés le début de la ligne, tu peux toujours l'ancrer. Ça limitera les recherches à une seule position de départ: le début de la ligne, sans quoi la pattern sera testée au départ de chaque caractère de la ligne dans le pire des cas. C'est une stratégie pour accélérer l'échec de la pattern. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for "org-mode-gtk.raku".IO.lines {
        .say if /^(.*?)" # TODO "(.*)/;
    }

  3. #3
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    En effet, la capture est importante, car une foi que j'ai trouvé, j'ai évidemment envie de traiter la ligne. (et pas simplement l'afficher)
    Donc l'ancrage ^, et même en fin $, accélère bien les chose.
    Je reste étonné quand même, par curiosité j'ai fait le test en perl5, et même sans les ancres, ça va plus vite. Mais je sais que le moteur regex est plus complexe.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Lenteur avec TComPort
    Par PhDt76 dans le forum C++Builder
    Réponses: 22
    Dernier message: 27/09/2003, 21h43
  2. lenteur d'affichage de requete dans un DBGrid
    Par nico27 dans le forum InterBase
    Réponses: 9
    Dernier message: 23/06/2003, 13h54
  3. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24
  4. [Sybase]probleme de lenteur
    Par MASSAKA dans le forum Sybase
    Réponses: 3
    Dernier message: 19/03/2003, 22h58
  5. Lenteur d'execution de Jbuilder 6
    Par Tsimplice dans le forum JBuilder
    Réponses: 6
    Dernier message: 18/12/2002, 14h41

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