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 :

Probleme de performances en C sous Linux


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut Probleme de performances en C sous Linux
    Bonjour,

    A la base j'avais un programme en java que j'ai voulu traduire en C pour gagner en performances.

    Ce programme lit un tableau dans un fichier puis pendant le reste du temps le programme fait des opérations élémentaires sur ce tableau et celui-ci grandit peu à peu.

    Sous Windows mon programme C est 24% plus rapide que ce même programme en Java. Par contre sous linux le programme C est 2 ou 3 fois plus lent que le même en Java.

    C'est sur ce dernier point que j'aimerai avoir d'avantage d'informations, qu'est ce qui peut faire qu'un programme en C est plus lent que l'équivalent en java et cela exclusivement sous linux?

    A noter que je recompile bien a chaque fois mon programme sur l'OS concerné avant l''exécution. Mon windows fonctionne sous 32bits et linux est sous 64bits.

    En résumer:

    Sous Windows XP 32 bits:
    - Le programme C fonctionne plus vite que celui en java

    Sous SL (linux) 64 bits:
    - Le programme C fonctionne moins vite que celui en java


    Le programme java sous linux fonctionnant +- 100% plus vite que le même programme sous Windows.

    Merci beaucoup pour vos précieuses réponses

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu actives bien les options d'optimisation quand tu compiles sous 'nux?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu actives bien les options d'optimisation quand tu compiles sous 'nux?
    Non, je vais me renseigner la dessus tout de suite. Merci

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    J'ai essayé avec -o1 -o2 et -o3 mais ça ne change pas les performances.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Tu n'aurais pas un problème 32/64 bits ? Du genre linker les mauvaises librairies, et/ou avoir des performances dégradées par l'utilisation de code 32 bits devant se "traîner" 32 bits de plus sans raisons ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 387
    Points : 23 700
    Points
    23 700
    Par défaut
    Est-ce que l'on peut surtout voir ce programme ainsi que la ligne de commande que tu utilises pour le compiler ? Qu'un programme C se fasse battre par un programme Java, c'est déjà louche, mais 24% d'écart sur des opérations aussi simples, ça devient hallucinant.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Voilà mon code, c'est un petit programme que j'ai fais pour m'exercer.

    Le programme charge un nombre dans tab1 à partir d'un fichier. Chaque chiffre est stocké dans une ligne du tableau. Ensuite le programme retourne tab1 et met tout ça dans tab2. Enfin le programme additionne tab1 et tab2 et met le résultat dans tab3.

    Ma méthode est la suivante, n'hésitez surtout pas à me dire ce qui est pas propre et pas optimale.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int tab1[1000000];
    int tab2[1000000];
    int tab3[1000000];
    int *ptr_tab1 = &tab1[0];
    int taille; // taille de tab1
     
    void inverse(int *ptr)
    {
        int i;
     
        for(i = 0; i < taille;i++)
        {
            tab2[i] = ptr[taille-1-i];
        }
    }
     
    void format()
    {
        int i;
        for (i = 0; i < taille+1; i++)
        {
            tab3[i] = tab3[i+1];
        }
    }
     
    void addition (int * ptr)
    {
        int report = 0;
        int resultat = 0;
        int i;
        for (i = taille; i >= 0; i--)
        {
            resultat = ptr[i] + tab2[i] + report ;
            report = resultat / 10;
            tab3[i+1] = resultat % 10;
        }
     
        tab3[0] = report;
     
        if (tab3[0] == 0)
        {
            format();
        }
        else
        {
            taille++;
        }
    }
     
    int main()
    {
    	chargement()// charge un nombre dans tab1 a patir d'un fichier. Chaque chiffre est stocke dans une ligne du tableau. La variable "taille" est modifiée en consequence
    	int i;
    	for (a = 0; a < 100000; a++)
    	{
    		inverse(ptr_tab1);
    		addition(ptr_tab1);
    		ptr_tab1 = &tab3[0];
    	}
        return 0;
    }
    Merci beaucoup !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par comtention Voir le message
    Voilà mon code, c'est un petit programme que j'ai fais pour m'exercer.

    Le programme charge un nombre dans tab1 à partir d'un fichier. Chaque chiffre est stocké dans une ligne du tableau. Ensuite le programme retourne tab1 et met tout ça dans tab2. Enfin le programme additionne tab1 et tab2 et met le résultat dans tab3.

    Ma méthode est la suivante, n'hésitez surtout pas à me dire ce qui est pas propre et pas optimale.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int tab1[1000000];
    int tab2[1000000];
    int tab3[1000000];
    int *ptr_tab1 = &tab1[0];
    int taille; // taille de tab1
     
    void inverse(int *ptr)
    {
        int i;
     
        for(i = 0; i < taille;i++)
        {
            tab2[i] = ptr[taille-1-i];
        }
    }
     
    void format()
    {
        int i;
        for (i = 0; i < taille+1; i++)
        {
            tab3[i] = tab3[i+1];
        }
    }
     
    void addition (int * ptr)
    {
        int report = 0;
        int resultat = 0;
        int i;
        for (i = taille; i >= 0; i--)
        {
            resultat = ptr[i] + tab2[i] + report ;
            report = resultat / 10;
            tab3[i+1] = resultat % 10;
        }
     
        tab3[0] = report;
     
        if (tab3[0] == 0)
        {
            format();
        }
        else
        {
            taille++;
        }
    }
     
    int main()
    {
    	chargement()// charge un nombre dans tab1 a patir d'un fichier. Chaque chiffre est stocke dans une ligne du tableau. La variable "taille" est modifiée en consequence
    	int i;
    	for (a = 0; a < 100000; a++)
    	{
    		inverse(ptr_tab1);
    		addition(ptr_tab1);
    		ptr_tab1 = &tab3[0];
    	}
        return 0;
    }
    Merci beaucoup !
    Bonjour,

    3 choses qui me semblent incorrect :

    - Où sont les prototypes de fonctions ?

    - tu passes comme arguments à tes fonctions 'inverse' et 'addition' des variables qui sont déclarées en tant que variable globale.

    - tu utilises la variable 'taille' qui n'est pas initialisée. Ton compilo devrait t'avertir non ?

  9. #9
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Citation Envoyé par nico1811 Voir le message
    - Où sont les prototypes de fonctions ?

    - tu passes comme arguments à tes fonctions 'inverse' et 'addition' des variables qui sont déclarées en tant que variable globale.

    - tu utilises la variable 'taille' qui n'est pas initialisée. Ton compilo devrait t'avertir non ?
    - Pas forcement besoin, du moment que les fonctions sont déclarées avant d'être appelées.

    - .

    - La variable 'taille' est initialisée avec la fonction 'chargement'.

    Le mieux est d'éviter les variables globales. Tu peux largement t'en passer pour les passer en argument de tes fonctions (que tu fais partiellement).
    Plus tu pédales moins fort, moins t'avances plus vite.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Les tableaux ne tiendraient pas forcément sur la pile, mais peuvent être déclarés static dans le main().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Merci beaucoup pour vos avis, c'est très important.

    Citation Envoyé par nico1811 Voir le message

    - tu passes comme arguments à tes fonctions 'inverse' et 'addition' des variables qui sont déclarées en tant que variable globale.
    Voilà j'ai déclaré le pointeur ptr_tab1 dans la fonction recherche. C'est la seul chose qui clochait?

Discussions similaires

  1. probleme de compilation flight gear sous linux
    Par Asmod_D dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 28/03/2007, 15h30
  2. probleme d afichage avec apache sous linux .
    Par johnnyaque dans le forum Apache
    Réponses: 1
    Dernier message: 05/09/2006, 20h36
  3. Problème avec myODBC et odbc sous linux avec unixODBC
    Par tytyi11 dans le forum Administration système
    Réponses: 2
    Dernier message: 18/11/2005, 16h08
  4. Problème configuration d'une passerelle sous linux
    Par DiabolOFraisecoca dans le forum Réseau
    Réponses: 5
    Dernier message: 18/11/2005, 09h05
  5. Problemes de compilation avec g++ sous linux
    Par Selimmel dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 19/09/2003, 13h43

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