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

C++ Discussion :

Rapidité C++ vs VB.NET


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Rapidité C++ vs VB.NET
    Bonjour à tous,
    On m'a dit que le C++ était très rapide, plus rapide que le VB.NET
    Alors, j'ai fais deux teste, pour comparer la rapidité des deux langages.

    VB.NET :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Module Module1
     
        Sub Main()
            For i As Integer = 0 To 1000000
                Console.WriteLine(i)
            Next
     
            Console.ReadLine()
        End Sub
     
    End Module
    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    	for (int compteur = 0 ; compteur < 1000000 ; compteur++)
    	{
    		cout << compteur << endl;
    	}
     
    	char repo;
    	cin >> repo;
    	return 0;
    }
    A ma grande surprise, le VB.NET allait trois fois plus vite que le C++ avec pourtant exactement le même code !
    Savez-vous pourquoi ça c'est passé ainsi ?

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    1. Comment as-tu mesurer?
    2. Est-ce que tu as compile en configuration "Debug"? Si oui ca n'a aucun sens de tester les performances dans ce mode. Il faut le faire dans la configuration finale, en "Release" par defaut sous VS.
    3. Remplace endl par '\n'. Sauf si tu feux flusher la console a chaque output, ce que VB ne fait certainement pas.
    4. Au passage, pour ce genre de code, VB.Net devrait avoir des performances similaires (mais certainement en defaveur de .Net). C'est plutot avec des manipulations complexes et lourdes que tu vas voir une reelle difference. Essaie avec quelque chose de plus realiste?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse

    1. Comment as-tu mesurer?
    J'ai mesuré en fonction du temps qui s'écoulait du début du traitement jusqu’à la fin du traitement.

    2. Est-ce que tu as compile en configuration "Debug"? Si oui ca n'a aucun sens de tester les performances dans ce mode. Il faut le faire dans la configuration finale, en "Release" par defaut sous VS.
    J'ai bien fait l'opération en Release

    3. Remplace endl par '\n'. Sauf si tu feux flusher la console a chaque output, ce que VB ne fait certainement pas.
    Même résultat ...

    4. Au passage, pour ce genre de code, VB.Net devrait avoir des performances similaires (mais certainement en defaveur de .Net). C'est plutot avec des manipulations complexes et lourdes que tu vas voir une reelle difference. Essaie avec quelque chose de plus realiste?
    Pour l'instant, je veux juste tester ça
    Une fois que j'aurai compris, j'essayerai surement d'autre chose.

    Par contre, j'ai remarqué que l'application C++ prenait seullement 620K de mémoire, alors que le programme en VB.NET en prend 2816K !

    Comment augmenter la mémoire du programme C++ pour le faire accélérer ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    La vitesse d'exécution n'a strictement rien à voir avec la mémoire allouée pendant son exécution.
    Par ailleurs ta méthode de "calcul" de la vitesse d'exécution me semble... Bancale pour ne pas dire ridicule et naze.
    Vue la simplicité du code, la différence sera probablement inférieure à la seconde, et je doute très grandement que tu aies une telle précision.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Invité
    Invité(e)
    Par défaut
    OK ok
    Bref, j’abandonne ce test.

    Tu n'aurai pas une idée de programme qui montrerai vraiment la différence entre les deux langages ?

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    un bete produit scalaire de deux tableaux de N > 10^6 elements de type double

  7. #7
    Invité
    Invité(e)
    Par défaut
    un bete produit scalaire de deux tableaux de N > 10^6 elements de type double
    Merci
    Mais j'ai rien compris

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Définition du produit scalaire:
    Dans l'espace Rn, on définit le produit scalaire canonique : (x1, x2, ..., xn) . (y1, y2, ..., yn) = x1*y1 + x2*y2 + ... + xn*yn
    Dans ton cas, n >= 10⁶, une possible implémentation en C++ serait :
    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
    #include <vector>
    #include <algorithm>
    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    #include <chrono>
     
    using namespace std;
     
    int main(int argc, char* argv[])
    {
    	const int size = 10000000;
    	vector<double> v1(size), v2(size);
    	const int max = 5;
    	auto f = [max]{ return rand() % max; };
     
    	srand(time(nullptr));
    	generate(begin(v1), end(v1), f);
    	generate(begin(v2), end(v2), f);
     
    	double scalar_product = 0;
    	auto it = begin(v2);
     
    	auto t1 = chrono::high_resolution_clock::now();
    	for_each(begin(v1), end(v1), [&scalar_product, &it](double e){ scalar_product += e * (*it); ++it; });
    	auto t2 = chrono::high_resolution_clock::now();
     
    	cout << "scalar_product  = " << scalar_product << " duration = " << chrono::duration_cast<chrono::milliseconds>(t2 - t1).count() << endl;
     
    	return 0;
    }
    [EDIT]en changeant le type des éléments des array en double, le code plante, idem si je mets une taille trop grande genre 2 000 000 ?

  9. #9
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par backlash Voir le message
    [EDIT]en changeant le type des éléments des array en double, le code plante, idem si je mets une taille trop grande genre 2 000 000 ?
    (Sans trop m'avancer sur la véritable raison.)
    std::array vit dans la pile (il n'y a pas pas d'allocation dynamique). La taille de la pile est bien plus limitée que celle du tas. Si tu remplaces ton std::array par un std::vector ça devrait fonctionner.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    il semblerait que tu aies raison Ehonn, cela semble cohérent car je tourne sur une distrib Ubuntu 64bits, en tapant la commande ulimit -a j'ai comme info que ma stack size = 8192kbytes, autrement dit ma stack ne peut contenir que (approximativement) 8 192 000 / sizeof(int) = 8 192 000 / 4 = 2 048 000 int, ce qui semblait être (approximativement) la limite de mon array.

    Ainsi le code a été édité en utilisant cette fois ci un vector.

  11. #11
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par backlash Voir le message
    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
    #include <vector>
    #include <algorithm>
    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    #include <chrono>
     
    using namespace std;
     
    int main(int argc, char* argv[])
    {
    	const int size = 10000000;
    	vector<double> v1(size), v2(size);
    	const int max = 5;
    	auto f = [max]{ return rand() % max; };
     
    	srand(time(nullptr));
    	generate(begin(v1), end(v1), f);
    	generate(begin(v2), end(v2), f);
     
    	double scalar_product = 0;
    	auto it = begin(v2);
     
    	auto t1 = chrono::high_resolution_clock::now();
    	for_each(begin(v1), end(v1), [&scalar_product, &it](double e){ scalar_product += e * (*it); ++it; });
    	auto t2 = chrono::high_resolution_clock::now();
     
    	cout << "scalar_product  = " << scalar_product << " duration = " << chrono::duration_cast<chrono::milliseconds>(t2 - t1).count() << endl;
     
    	return 0;
    }
    Existe-t-il toutes ces librairies dans VB.NET ? sinon, la comparaison va être difficile.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par MicBeastKiller Voir le message
    Existe-t-il toutes ces librairies dans VB.NET ? sinon, la comparaison va être difficile.
    J'ose espérer qu'on peut utiliser des tableaux de données en VB oui..
    Aucune lib particulière n'est utilisée ici.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Bousk Voir le message
    J'ose espérer qu'on peut utiliser des tableaux de données en VB oui..
    Aucune lib particulière n'est utilisée ici.
    Je parlais justement de <vector> (et aussi <algorithm>) qui n'est certes pas une librairie à proprement parlé, mais reste néanmoins très évolué comparé à un tableau classique. Donc si l'implémentation en VB se fait par du tableau classique, la comparaison va être difficile.
    J'aurais plutôt fait une implémentation avec des choses très basiques, pour être sûr de pouvoir le faire dans les deux langages.

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Utiliser un vector, array ou "tableau classique" ne change strictement rien quant à l'utilisation des données. Il s'agit de données contiguës en mémoire et cest tout ce qui importe. On ne parle pas de la création de ces données.
    De même que algorithm ne fournit rien de particulier, écrire une boucle for et faire un appel à la méthode utilisée par le foncteur ne change rien au traitement des données.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par MicBeastKiller Voir le message
    Je parlais justement de <vector> (et aussi <algorithm>) qui n'est certes pas une librairie à proprement parlé, mais reste néanmoins très évolué comparé à un tableau classique. Donc si l'implémentation en VB se fait par du tableau classique, la comparaison va être difficile.
    J'aurais plutôt fait une implémentation avec des choses très basiques, pour être sûr de pouvoir le faire dans les deux langages.
    C'est VB.NET, ya les container et algos qu'en C# a ce que je sache, et ya bien leurs equivalent a c++.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2014, 12h29
  2. Comment expliquer la rapidité du référencement de developpez.net
    Par CUCARACHA dans le forum Référencement
    Réponses: 5
    Dernier message: 01/07/2009, 01h14
  3. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 03h17
  4. rapidité de traitement en Dot net
    Par reverse_engineer dans le forum Débuter
    Réponses: 8
    Dernier message: 17/08/2008, 19h25
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 10h45

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