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

Langages de programmation Discussion :

Performances : JAVA vs C# vs C


Sujet :

Langages de programmation

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Par défaut Performances : JAVA vs C# vs C
    Je me suis amusé à écrire un petit test afin de comparer les performance du JAVA, du C#, et du C, et j'obtiens des résultats assez étranges, pas du tout ce que j'attendais.

    Je m'attendais à avoir C > C# > JAVA, et j'ai JAVA >= C >> C# ! Oui la version JAVA est la plus rapide !

    Pour ce test, j'ai fait un tri bulle d'un tableau de 25000 éléments générés aléatoirement.
    Java : 1050ms
    C : 1100ms (gcc -O3)
    C# : 5000 1478 en compilation release

    Vous en pensez quoi ? c'est mon test qui est mauvais ? Je met les 3 versions ci dessous.


    Version 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    
    namespace TestBubleSort
    {
        class Program
        {
            public static long triBulle(int[] tableau)
            {
            int longueur=tableau.Length;
            bool inversion;
            long echanges=0;
            
            do
                {
                inversion=false;
    
                for(int i=0;i<longueur-1;i++)
                    {
                    if(tableau[i]>tableau[i+1])
                        {
                        echanger(tableau,i,i+1);
                        inversion=true;
                        echanges++;
                        }
                    }
                 }
            while(inversion);
            return echanges;
            }
    
            public static void echanger(int[] tableau, int i1, int i2)
            {
                int tmp = tableau[i1];
                tableau[i1] = tableau[i2];
                tableau[i2] = tmp;
            }
    
            static void Main(string[] args)
            {
    
                Stopwatch stopw = new Stopwatch();
                int[] tableau = new int[250 *100];
                Random r = new Random();
                for (int i = 0; i < tableau.Length; i++)
                {
                    tableau[i] = r.Next();
                }
                //Démarrage du chrono 
                stopw.Start();
                long echanges = triBulle(tableau);
                stopw.Stop();
                
                
                //On récupère la durée écoulé, en millisecondes 
                long milliseconds = stopw.ElapsedMilliseconds;
    
                Console.WriteLine(echanges + "echanges, " + milliseconds + "ms");
                Console.ReadKey();
                
            }
        }
    }
    Version Java
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class test {
    
    	 public static long triBulle(int[] tableau)
         {
         int longueur=tableau.length;
         long echanges = 0;
         boolean inversion;
         
         do
             {
             inversion=false;
    
             for(int i=0;i<longueur-1;i++)
                 {
                 if(tableau[i]>tableau[i+1])
                     {
                     echanger(tableau,i,i+1);
                     echanges++;
                     inversion=true;
                     }
                 }
              }
         while(inversion);
         
         return echanges;
         }
    
         public static void echanger(int[] tableau, int i1, int i2)
         {
             int tmp = tableau[i1];
             tableau[i1] = tableau[i2];
             tableau[i2] = tmp;
         }
    	public static void main(String[] args) {
    		int[] tableau = new int[250*100];
    		for (int i = 0; i < tableau.length; i++)
            {
                tableau[i] = (int)(Integer.MAX_VALUE*Math.random());
            }
    		
    		long debut = System.currentTimeMillis();
    		long echanges = triBulle(tableau);
    		long fin = System.currentTimeMillis();
    		System.out.println(echanges + "echanges, " + (fin-debut) + "ms");
    		
    	}
    
    }
    Version 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define longueur 25000
    
    void echanger(int tableau[], int i1, int i2)
    {
    	int tmp = tableau[i1];
    	tableau[i1] = tableau[i2];
    	tableau[i2] = tmp;
    }
    long triBulle(int tableau[])
    {
    	
    	int inversion;
    	long echanges=0;
    
    	do
    	{
    		inversion=0;
    		int i;
    		for(i=0;i<longueur-1;i++)
    		{
    			if(tableau[i]>tableau[i+1])
    			{
    				echanger(tableau,i,i+1);
    				inversion=1;
    				echanges++;
    			}
    		}
    	}
    	while(inversion);
    	
    	return echanges;
    }
    
    
    
    int main(void)
    {
    	int *tableau = malloc(longueur*4);
    	srand(time(NULL));
    	int i;
    	for (i = 0; i < longueur; i++)
    	{
    		tableau[i] = rand();
    	}
    	clock_t start, finish;
    	
    	start = clock();
    	long echanges = triBulle(tableau);
    	finish = clock();
    	double seconds = (double)(finish - start) / CLOCKS_PER_SEC; 
    	
    	printf("%ld echanges, %f secondes\n",echanges, seconds);
    }

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Ce n'est pas spécialement choquant. Compare l'occupation mémoire par contre, ça peut être intéressant.

    Et si tu veux rigoler, utilises la classe BigInteger de Java pour gérer des grands nombres et compare avec GMP en C, tu verra que ce qui compte surtout ce n'est pas la vitesse des opérations de base, mais surtout la vitesse des librairies spécialisés que tu emploies.

    C'est le sujet de mon unique () billet de blog, que tu as sur le bouton WWW de mon profil. J'y compare justement l'utilisation des BigInteger par rapport à GMP.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    On a pas déjà eu un fil là dessus sur le forum C++? C'est pas un code qui vient d'un blog?

    ici:
    http://www.developpez.net/forums/d10...mpilation-cpp/

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Par défaut
    Merci pour vous réponse

    j'ai écrit ce code moi même (j'ai cherche un algo pouvant prendre un peu de temps). Je m'attendais à un rapport de 10 peut être, étant donnée que le le code est interprété. J'ai donc été très surpris...

    nikko, le lien que tu donnes est intéressant, et en gros j'en retiens que si on code sans chercher à optimiser, java est aussi performant sur du calcul, grâce à git à priori. Par contre ils parlent de g++, alors que j'ai pour ma part utilisé gcc.

    YannPeniguel je m'en vais voir ton unique billet de blog alors !

    edit : je suis allé voir ton billet, et je t'ai même répondu Une linked list est ce qu'il y a de pire (ou presque, O(n) + nombreux pointeurs à suivre) pour rechercher un élément, pas étonnant que c'était très long ! Je suppose que la GSList est intelligente et utilise un arbre 2-3 ou au pire un tableau.
    le lien pour les autres : http://ypeniguel.blogspot.com/2011/0...t-du-java.html

  5. #5
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    La GSlist est une liste simplement chainée, elle est donc "équivalente" à celle utilisée dans mon programme en Java.

    Après, comment elle est implémenté, ça je n'en sais rien.

    J'ai remplacé GSList dans mon programme C par un GTree, j'ai 17ms pour la version C et 90ms pour la version Java (avec TreeSet).

    Je poste le code en commentaire sur le blog.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Ton code n'est pas representatif des langages et de leurs applications.

    L'un des problemes de Java est le garbage collector, qui arrete tout lorsqu'il passe. Dans ton cas, le GC ne passe a priori pas, donc tu ne perds pas de temps dans cette partie.

    En revanche, dans un serveur d'application qui passe son temps a construire ou a detruire des objets, le temps de passage du GC n'est pas negligeable.

    En C, ce qui est souvent decrie est la gestion memoire a faire a la main. Mais la encore, tu n'as pas ce probleme, puisque tu fais simplement du calcul. Donc pas de bug, donc pas de surcout de developpement, donc tu ne vois pas les inconvenients reproches au C en entreprise.


    Pour comparer deux langages, il ne suffit pas de faire un bout de programme qui fait un seul truc : il faut faire beaucoup de choses, afin de passer dans un maximum de cas, certains favorables au langages, d'autres defavorables, et vice-versa.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    L'un des problemes de Java est le garbage collector, qui arrete tout lorsqu'il passe. Dans ton cas, le GC ne passe a priori pas, donc tu ne perds pas de temps dans cette partie.
    Ca fait quand même un certain temps qu'ils ont un GC concurrent quand même !
    http://www.oracle.com/technetwork/ja...ble_collectors

  8. #8
    Membre très actif
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations forums :
    Inscription : Septembre 2008
    Messages : 168
    Par défaut
    de toutes les facons g pa essayer mais je peux voir une méthode statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long debut = System.currentTimeMillis();
    alors qu'en c# on passe d'abord par l'instanciation et ensuite l'appel à Start et Stop!
    A noter que Gabbage Collector se charge de tuer ton objet stopw, ce qui peut prendre encore du temps!
    Moi à ta place je creerai trois mêmes séries des lignes de codes et tester ensuite.
    tu devrais utiliser un équivalent proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long debut = System.currentTimeMillis();
    dans l'objet DateTime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long debut = DateTime.Now.Ticks;
    si je me trompe pas!

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par TropMDR Voir le message
    Ca fait quand même un certain temps qu'ils ont un GC concurrent quand même !
    http://www.oracle.com/technetwork/ja...ble_collectors
    Tout d'abord, le GC concurrent n'a ete introduit que dans Java 1.6, soit plus de 10 ans apres la premiere version du langage (en supposant qu'il fut dans java 1.6 des le debut). Il a ensuite ete remplace dans java 1.7, pour ameliorer encore le gain de performance.
    Ensuite, cela ne fait que minimiser les temps de pause :
    The concurrent collector performs most of its work concurrently (i.e., while the application is still running) to keep garbage collection pauses short.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Pour alimenter le troll, voici un classement des langages : http://shootout.alioth.debian.org/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    Salut,

    Pour le compilateur c, il faut faire o2. En o3 il essai tellement d'optimiser que desfois il fait mal son boulot

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    J'ajouterai aussi qu'en .net, je ne suis pas sur de ce que je dis, mais déploie ton application pour réellement tester.. j'ai l'impression que visual studio rajoute du temps d'execution en plus

Discussions similaires

  1. Comparaison de performances Java
    Par pvh35 dans le forum Général Java
    Réponses: 1
    Dernier message: 19/01/2012, 17h24
  2. [CDI] ingénieur de développement et test de performance Java /JEE
    Par Sfaxiano dans le forum Demandes
    Réponses: 0
    Dernier message: 20/03/2011, 14h14
  3. Problème performance java
    Par maloups dans le forum Oracle
    Réponses: 1
    Dernier message: 03/09/2007, 08h59
  4. [Performance Java] Selon le matos
    Par L. Sierra dans le forum Langage
    Réponses: 7
    Dernier message: 01/10/2006, 18h36

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