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 Java Discussion :

Regex & Performances


Sujet :

Langage Java

Vue hybride

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

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut Regex & Performances
    Bonjour!

    J'utilise l'expression régulière suivante:
    [quote]
    "\"(( {6})|([\\d]{6}))\",\"(( {1})|([\\d]{1}))\",\"(( {2})|([\\d]{2}))(( {8})|([\\d]{8}))\",\"[0-9][0-9AB]\",\"(( {3})|([\\d]{3}))\",\"(( {10})|([\\d]{10}))\",\"(( {2})|([\\d]{2}))\",\"(( {4})|([\\d]{4}))\",\"(( {2})|([\\d]{2}))\",\"(( {2})|([\\d]{2}))(( {2})|([\\d]{2}))\",\"(( {2})|([\\d]{2}))\",\"(( {2})|([\\d]{2}))\",\"(( {1})|([\\d]{1}))\",\"(( {2})|([\\d]{2}))\",\"(( {1})|([\\d]{1}))\",\"(( {6})|([\\d]{6}))\",\"(( {6})|([\\d]{6}))\",\"(( {6})|([\\d]{6}))\",\"(( {6})|([\\d]{6}))\",\"(( {1})|([\\d]{1}))\",\"(( {2})|([\\d]{2}))\"";
    [quote]

    Et mon problème actuel est que la parsing de cette expression par JDK (j'utilise le package java.util.regex) est très lent.

    Alors que pour la pluspart des expressions regulières, le temps est négligeable, là il faut 3 secondes, ce qui est très bloquant quand le parsing est refat plusieurs milliers de fois (je sais c'est pas nécessaire, mais c'est comme ça...)

    D'où ma question:
    Est-ce que mon expression regulière est normale? Est-ce que l'usage de tant de | (or) de cette façon la ralentit? Est ce que vous voyez une alternative (en gros, ce sont des champs d'une longueur donnée qui sont soit entières vides, soit entièrement numériques)?


  2. #2
    Membre expérimenté Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Par défaut
    Slt,
    Juste un petit avis. Si ce sont des champs de textes que tu remplis et que tu veux tester, plutot que de regarder si l'expression saisie est correcte pourquoi ne pas mettre en evenement a chaque appui sur une touche du clavier pour verifier si le caractere frappe est correct et de l'afficher si c'est le cas. Ca t'evitera d'avoir une expression reguliere aussi longue.
    Je ne suis pas un pro en expression reguliere mais si tu veux juste voir si le champs est numerique ou vide ton expression reguliere parait un peut longue.

  3. #3
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par fumiste972
    Juste un petit avis. Si ce sont des champs de textes que tu remplis et que tu veux tester, plutot que de regarder si l'expression saisie est correcte pourquoi ne pas mettre en evenement a chaque appui sur une touche du clavier pour verifier si le caractere frappe est correct et de l'afficher si c'est le cas. Ca t'evitera d'avoir une expression reguliere aussi longue.
    Ce n'est pas dans cadre interactif, je dois vérifier le format d'un fichier en entrée....

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu peux déjà essayer de supprimer les groupes ( ) inutiles, par exemple (en rouge) : "\"(( {6})|([\\d]{6}))\"

    Sinon tu peux tenter avec l'API ORO de Jakarta.

    a++

    PS : File nous une ligne de données qui est longue à traiter, cela pourrait nous permettre de tester

  5. #5
    Membre expérimenté Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Par défaut
    Ah ok autant pour moi.

  6. #6
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par adiGuba
    PS : File nous une ligne de données qui est longue à traiter, cela pourrait nous permettre de tester
    Voila le fichier exemple et le cas de test (dépendances log4j 1.2.13 et junit 3.8.1).


  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est la compilation du pattern qui est très long ( 1.7 à 2 secondes chez moi). La création du matcher et l'appel à matches() est très rapide (entre 0-15ms).

    Du coups lorsque tu le fait à l'intérieur de la boucle (comme dans testRegexAvanceeNoParsing()) c'est très long, mais si tu ne le compile qu'une seule fois avant (comme dans testRegexAvanceeParsing()) c'est nettement plus rapide (en fait le plus long est la compilation du pattern...

    as-tu vraiment besoin de recompiler le pattern à chaque fois ???

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

Discussions similaires

  1. Performance des Regex en .NET
    Par Eric80 dans le forum Framework .NET
    Réponses: 10
    Dernier message: 07/07/2010, 14h55
  2. Réponses: 2
    Dernier message: 19/09/2007, 12h46
  3. [Performance] IndexOf() ou java.util.regex ?
    Par scifire dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2006, 19h16
  4. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

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