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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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