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

VB.NET Discussion :

Différence de perf entre C# et VB.Net pour une boucle avec une regex, pourquoi ?


Sujet :

VB.NET

  1. #1
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 382
    Points
    382
    Billets dans le blog
    1
    Par défaut Différence de perf entre C# et VB.Net pour une boucle avec une regex, pourquoi ?
    Bonjour,

    j'utilise cette boucle en VB.NET

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    "Dim mStreamReader As StreamReader = New StreamReader("10-million-combos.txt")
        line = mStreamReader.ReadLine()
        Do While (line IsNot Nothing)
            counter += 1
            If Regex.IsMatch(line, "123456$") Then counter2 += 1
            line = mStreamReader.ReadLine()"
    Pour parser un fichier de 2 go, compter le nombre de lignes, compter le nombre d’occurrences. Rien de bien spécial jusqu'ici. Ca s’exécute sur ma machine en 100,15s.

    Ce qui m'agace, c'est que le même code en C# s’exécute en 30,05s.

    C#

    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
        Regex rgx = new Regex("123456$");
        int counter = 0;
        int counter2 = 0;
        using (StreamReader sr = new StreamReader(@"10-million-combos.txt"
    +))
        {
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                ++counter;
                if (rgx.IsMatch(line))
                {
                    ++counter2;
                }
            }
        }
    Je comprends pas ce qui ne va pas dans mon code. Ca semble globalement être la même chose. Une idée ? Le code a été fait sous VS 2010 P.I.

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Est-ce que t'as essayé de faire une conversion du code avec un convertisseur de code ?

    http://converter.telerik.com/

    Voir ensuite s'il y a une différence entre les deux mais avec un benchmark dans les règles de l'art. Pas juste une exécution avec le défragmenteur de disque en arrière plan...

    Après on pourra commencer à troller sur les différences de performance entre les languages.

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Ca ma parait bizarre... Peut être la différence se situe en dehors de cette boucle... tu chronomètre juste la boucle ?

    Sinon pour être tout à fait similaire sur la syntaxe :

    1) plutôt que de faire appel à la procédure (shared) Regex.Match( ,)
    Tu peux déclarer le pattern en créant une instance de regex, tout comme en C#:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim rgx As New System.Text.RegularExpressions.Regex("123456$")
    2) Tu peux aussi utiliser le using sur le stream reader, pour éviter de mutiple appel du même objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using mStreamReader
     
    Line = .ReadLine()
    Mais je sais pas si ca peut faire gagner 70% de temps... Ca m'étonnerai... m'enfin

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2015
    Messages : 35
    Points : 32
    Points
    32
    Par défaut
    En faisant toutes les lignes d'un coup, tu gagnes du temps ou pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Dim regex As New System.Text.RegularExpressions.Regex("(123456$|123456\n|123456\r\n)")  MsgBox(regex.Matches(IO.File.ReadAllText("10-million-combos.txt")).Count)

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 128
    Points : 109
    Points
    109
    Par défaut
    le C# de base est plus puissant que le vb c'est pas car les 2 sont de la part de microsoft et sous .net que ils ont la meme performance un code C# fonctionne différement d'un code vb.net


    edit : pour un test j'ai fait une simple boucle +1 au titre de l'app sur les 2 languages, ouvert le l'app vb, puis apres un peu celle en Csharp et elle l'a tres vite ratrappé

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Citation Envoyé par themine702 Voir le message
    le C# de base est plus puissant que le vb c'est pas car les 2 sont de la part de microsoft et sous .net que ils ont la meme performance un code C# fonctionne différement d'un code vb.net


    edit : pour un test j'ai fait une simple boucle +1 au titre de l'app sur les 2 languages, ouvert le l'app vb, puis apres un peu celle en Csharp et elle l'a tres vite ratrappé

    Pas du tout, mais alors pas du tout...

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 128
    Points : 109
    Points
    109
    Par défaut
    c'est ce que j'ai cru pendant des années aussi, mais non la maniere dans le code est compiler n'est pas la meme, j'ai vraiment pas envie d'écrire trop mais voilà une explication lointaine :

    dans un language interprété, moin la syntaxe est complexe (du niveau classique d'un language) plus l'interprétation est plus rapide, ici et part une image du lien que tu m'a donné :
    Nom : Overview_of_the_Common_Language_Infrastructure.png
Affichages : 253
Taille : 39,2 Ko
    les languages .net sont converti en un seul language le "CIL" eh bah le compilateur(convertisseur en cil) de chaque langage il convertit pas de la meme façon, et vb.net est énormément moin strict que le Csharp moin c'est strict plus de code y'aura l'hors de la convertions apres biensure dans des certains cas


    je sais que c'est tres mal exprimé et j'ai pas parler en détail mais croit moi, le vb est moin puissant dans la majorité des cas des fois c'est très légers, des fois c'est flagrant et des fois y'a pas de différences

    t'as qu'a tester apres tout sur VS community y'a les 2 gratuit t'as qu'a tester

  8. #8
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 382
    Points
    382
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sinople Voir le message
    Un benchmark dans les règles de l'art. Pas juste une exécution avec le défragmenteur de disque en arrière plan...
    Bonjour, vous parlez de l'indexation ou de la défragmentation. Parce que ces dernières ne se déclenchent il me semble que dans des cas bien spécifique (copie de nouveau fichiers, ordinateur en veille depuis x temps, et à la demande bien entendu) ? Mais quelque soit l'ordre si c'est votre remarque, le résultat ne change pas. Quand au troll de language j'aimerai éviter si possible, je suis juste là pour comprendre ou est mon erreur (si il y en a une).

    Pour le convertisseur, ça donne la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    StreamReader monStreamReader = new StreamReader("E:\\HD_PROJECT\\Dev\\Works\\2016.04.04 - Tests Languages\\Tests\\10-million-combos.txt");
    	ligne = monStreamReader.ReadLine();
    	while ((ligne != null)) {
    		counter += 1;
    		if (Regex.IsMatch(ligne, "123456$"))
    			counter2 += 1;
    		//Console.WriteLine(ligne)
    		ligne = monStreamReader.ReadLine();
    	}
    Ha et si vous désirez le fichier de test. par curiosité .

    Citation Envoyé par sinople;mactwist69
    tu chronomètre juste la boucle ?
    Non, tout le programme. C'est un exe console, que je lance en batch, avec affichage avant après, pour la neutralité du comparatif.

    Citation Envoyé par sinople;mactwist69
    Dim rgx As New System.Text.RegularExpressions.Regex("123456$")
    Super, c'est ça ! Maintenant j'obtiens 28,18 sur C# contre 27,25 en VB.Net.

    Citation Envoyé par sinople;mactwist69
    Tu peux aussi utiliser le using sur le stream reader, pour éviter de mutiple appel du même objet
    On est d'accord que là, c'est juste purement pour le confort d'écriture, ce n'est qu'un raccourcis, non ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Tu as fais un teste en début dans l'éditeur ou sur l'exe après compilation?

    Édite: Je crois que tu as répondu mais ce qui est dit est dit!

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Bonjour, vous parlez de l'indexation ou de la défragmentation. Parce que ces dernières ne se déclenchent il me semble que dans des cas bien spécifique (copie de nouveau fichiers, ordinateur en veille depuis x temps, et à la demande bien entendu) ? Mais quelque soit l'ordre si c'est votre remarque, le résultat ne change pas.
    La remarque avait surtout pour objectif que les conditions de test soient correct et équitable entre les participants. Comme on parle de manipulation d'un fichier de bonne taille, il n'est pas rare que le facteur limitant soit les accès au disque plutôt qu'autre choses. Et les activités citées sont un exemple de facteur externe pouvant avoir une incidence sur les performances du disque.

    Quand au troll de language j'aimerai éviter si possible, je suis juste là pour comprendre ou est mon erreur (si il y en a une).
    Pour le troll de language, d'autre ont déjà commencé. Mais vous avez déjà du comprendre que le problème est plus du à l'écriture non optimisée de code plutôt qu'à de sombre histoire de compilateur. Après est-ce que l'un des deux languages est plus à même de provoquer ce genre de code c'est un débat sans fin.

  11. #11
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour

    ILDasm est ton ami......
    Mais du fait meme qu'on utilise 2 compilateurs diffrents,VBC.exe et CS.exe, il y aura un code IL different pour certaines constructions specifiques aux 2 languages ...

    Pour lever le doute ,ILDasm est sous la main pour generer le code IL et l'examiner...

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 128
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour

    ILDasm est ton ami......
    Mais du fait meme qu'on utilise 2 compilateurs diffrents,VBC.exe et CS.exe, il y aura un code IL different pour certaines constructions specifiques aux 2 languages ...

    Pour lever le doute ,ILDasm est sous la main pour generer le code IL et l'examiner...

    c'est ce que je voullait expliquait dans une réponse en haut et ils me disent non non :3

  13. #13
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Oui nan mais enfin bon... "certaines construction spécifiques".... ça dois pas être des masses... C'est quand même le même framework, interpréter par le même CLR... au pire c'est sur des trucs genre les délégués anonymes, pas sur une boucle DoWhile...

    Et entre dire que VB et C# sont un peu différent en pré-compiler et déduire que ces deux langages ont des performances significativement différentes... y'a un pas à passer tout de même. Si c'était le cas, personne ferait du VB...

    Parce que au début de la discussion, l'explication de themine702 est que VB et C# sont tellement différent que sur un code de 4 lignes cela explique une différence de 400% de rapidité...

    Et preuve en est : après adaptation du code, ils sont quasi pareils. Bref
    EDIT : après avoir relu, le code VB est donc plus rapide !!!! lol



    Et john.fender, non, le using, n'est pas seulement un confort... Il accélère l'accès à un objet.
    Perso, quand je dois éditer 50 paramètres d'une variable, j'utilise systématiquement le using. Ou dans les boucle aussi.
    Ca fait une différence, surtout si l'objet est lourd.

    Autre utiliter du using : utiliser sur un objet non managé par exemple de type SqlConnection, le using assure de libérer l'objet (même si le code plante)
    (Sinon, il faut bien penser à le faire dans le Finally)

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 128
    Points : 109
    Points
    109
    Par défaut
    éxagére pas j'ai jamais parlait de 4 lignes ni de aucun rajout j'ai dit des fois c'est peu, des fois rien, et des fois flagrants et oui y'a une différence entre surtout dans la partie ou le vb est beaucoup moin strict j'en parlerai apres là je dois sortir

  15. #15
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    En l’occurrence, ici, le VB est plus rapide... Donc ta théorie est plus de l'ordre de la croyance.
    Je sais pas pourquoi, je sens que tu vas avoir du mal à l'admettre... Moi je m'en fous, je suis pas l'inventeur du VB...

    Et la rigueur du C# (encore que c'est pas phénoménal comme différence), n'accélère pas la vitesse d’exécution... Au mieux, ça oblige à faire du code plus sûr.

  16. #16
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par themine702 Voir le message
    .....j'ai dit des fois c'est peu, des fois rien, et des fois flagrants et oui y'a une différence entre surtout dans la partie ou le vb est beaucoup moin strict j'en parlerai apres là je dois sortir
    Ce n'est plus l objet du debat alors il n'est plus utile de traiter de ce genre de sujet qui nous le savons tous aborde davantage un echange religieux plutôt qu autre chose !

    @john.fender : passes ton topic en résolu

    ++

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 128
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Ce n'est plus l objet du debat alors il n'est plus utile de traiter de ce genre de sujet qui nous le savons tous aborde davantage un echange religieux plutôt qu autre chose !

    @john.fender : passes ton topic en résolu

    ++
    effectivement :p

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

Discussions similaires

  1. Différence de perf entre environnements
    Par FranckRav dans le forum Administration
    Réponses: 11
    Dernier message: 06/05/2010, 11h46
  2. [ASE] : Différence de Perfs entre DOL et APL
    Par jeeps64 dans le forum Adaptive Server Enterprise
    Réponses: 9
    Dernier message: 05/02/2008, 13h28
  3. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54
  4. [VB.NET] Alimenter un dataset avec une chaine XML...
    Par David.V dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/05/2004, 09h09
  5. Réponses: 13
    Dernier message: 16/04/2004, 12h00

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