Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 22h21   #1
Patak
Membre à l'essai
 
Homme
Inscription : août 2011
Messages : 93
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 93
Points : 23
Points : 23
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 :
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 :
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 ?
Patak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 22h42   #2
Klaim
Expert Confirmé
 
Avatar de Klaim
 
Homme Joel Lamotte
Développeur de jeux vidéo
Inscription : août 2004
Messages : 1 552
Détails du profil
Informations personnelles :
Nom : Homme Joel Lamotte
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 552
Points : 2 965
Points : 2 965
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?
Klaim est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2012, 22h59   #3
Patak
Membre à l'essai
 
Homme
Inscription : août 2011
Messages : 93
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 93
Points : 23
Points : 23
Merci pour ta réponse

Citation:
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.

Citation:
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

Citation:
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 ...

Citation:
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 ?
Patak est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/12/2012, 01h36   #4
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 543
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 543
Points : 4 084
Points : 4 084
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 10h00   #5
Patak
Membre à l'essai
 
Homme
Inscription : août 2011
Messages : 93
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 93
Points : 23
Points : 23
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 ?
Patak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 19h13   #6
Joel F
Membre Expert
 
Avatar de Joel F
 
Homme Joel Falcou
Chercheur en informatique
Inscription : septembre 2002
Messages : 898
Détails du profil
Informations personnelles :
Nom : Homme Joel Falcou
Âge : 33
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2002
Messages : 898
Points : 2 056
Points : 2 056
Envoyer un message via MSN à Joel F
un bete produit scalaire de deux tableaux de N > 10^6 elements de type double
Joel F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 00h26   #7
Patak
Membre à l'essai
 
Homme
Inscription : août 2011
Messages : 93
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 93
Points : 23
Points : 23
Citation:
un bete produit scalaire de deux tableaux de N > 10^6 elements de type double
Merci
Mais j'ai rien compris
Patak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 02h19   #8
backlash
Membre habitué
 
Inscription : mars 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 114
Points : 119
Points : 119
Définition du produit scalaire:
Citation:
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 :
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 ?
backlash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 02h39   #9
Ehonn
Membre éprouvé
 
Étudiant
Inscription : février 2012
Messages : 206
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2012
Messages : 206
Points : 438
Points : 438
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.
Ehonn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 04h07   #10
backlash
Membre habitué
 
Inscription : mars 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 114
Points : 119
Points : 119
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.
backlash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 09h24   #11
MicBeastKiller
Membre du Club
 
Inscription : juin 2008
Messages : 120
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 120
Points : 62
Points : 62
Citation:
Envoyé par backlash Voir le message
Code :
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.
MicBeastKiller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 09h27   #12
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 543
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 543
Points : 4 084
Points : 4 084
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 15h34   #13
MicBeastKiller
Membre du Club
 
Inscription : juin 2008
Messages : 120
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 120
Points : 62
Points : 62
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.
MicBeastKiller est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 27/12/2012, 15h48   #14
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 543
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 543
Points : 4 084
Points : 4 084
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 16h21   #15
Klaim
Expert Confirmé
 
Avatar de Klaim
 
Homme Joel Lamotte
Développeur de jeux vidéo
Inscription : août 2004
Messages : 1 552
Détails du profil
Informations personnelles :
Nom : Homme Joel Lamotte
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 552
Points : 2 965
Points : 2 965
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++.
Klaim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h23.


 
 
 
 
Partenaires

Hébergement Web