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 :

Vitesse d'exécution d'un code en C.


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut Vitesse d'exécution d'un code en C.
    Bonjour à tous,

    en fait j'ai écrit un code en C qui me permet de calculer des propriétés physiques de mélanges de gaz. Ce code est lié dans un gros projet écrit en C++ OO et je me suis rendu compte lors de l'exécution que mon code était nettement plus lent que son équivalent qui avait été écrit en FORTRAN. J'ai quelques pistes mais j'aimerais avoir votre avis avant de changer pas mal de choses (je ne suis pas informaticien de formation...)

    1) lorsque l'on remplit une matrice via 2 boucles (1 boucle sur les lignes et 1 boucle sur les colonnes), vaut-il mieux boucler d'abord sur les lignes ou d'abord sur les colonnes (quelle boucle doit être à l'intérieur de l'autre)?

    2) Est-il plus rapide d'accéder aux éléments d'un vecteur si celui a été déclaré comme:
    ou s'il a été déclaré comme pointeur puis avoir alloué la mémoire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double *Vecteur;
    Vecteur=(double*)malloc(N*sizeof(double));
    Cela m'aiderait déjà beaucoup, merci d'avance.

    Christophe Riga.

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par criga Voir le message
    je me suis rendu compte lors de l'exécution que mon code était nettement plus lent que son équivalent qui avait été écrit en FORTRAN.
    Etant moi-meme un programmeur Fortran et C, j'aurais garde la partie calculatoire en Fortran. Il est fait pour cela, les optimisations faites par les compilateurs Fortran sont plus agressives, et les deux langages (ou le C++ a la place du C) peuvent se melanger relativement facilement au sein d'un meme projet.

    1) lorsque l'on remplit une matrice via 2 boucles (1 boucle sur les lignes et 1 boucle sur les colonnes), vaut-il mieux boucler d'abord sur les lignes ou d'abord sur les colonnes (quelle boucle doit être à l'intérieur de l'autre)?
    Sur la plupart des machines que je connais, les compilateurs C et Fortran adoptent des modeles memoires differents. Fortran est column-major, le premier indice est celui qui varie le plus rapidement, donc on boucle sur la dimension la plus droite en premier. Le C est row-major, deux elements consecutifs en memoire correspondent a la derniere dimension, donc on boucle sur la dimension la plus a gauche en premier.

    2) Est-il plus rapide d'accéder aux éléments d'un vecteur si celui a été déclaré comme:
    ou s'il a été déclaré comme pointeur puis avoir alloué la mémoire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double *Vecteur;
    Vecteur=(double*)malloc(N*sizeof(double));
    A part le cout de l'allocation dynamique, il ne devrait pas avoir de difference notable.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Sur la plupart des machines que je connais, les compilateurs C et Fortran adoptent des modeles memoires differents.
    Tu connais des exceptions? La situation pour le C est imposee par la norme. Il me semblait que c'etait le cas aussi pour le Fortran -- mais je connais beaucoup moins bien.

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut
    Sur la plupart des machines que je connais, les compilateurs C et Fortran adoptent des modeles memoires differents. Fortran est column-major, le premier indice est celui qui varie le plus rapidement, donc on boucle sur la dimension la plus droite en premier. Le C est row-major, deux elements consecutifs en memoire correspondent a la derniere dimension, donc on boucle sur la dimension la plus a gauche en premier.
    Je m'en doutais un peu, merci en tout cas pour la réponse très rapide.

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu connais des exceptions? La situation pour le C est imposee par la norme. Il me semblait que c'etait le cas aussi pour le Fortran -- mais je connais beaucoup moins bien.
    C'est marrant, j'etais convaincu du contraire: que le Fortran imposait le column-major (et en effet c'est dans la norme), mais que la norme C ne disait rien sur le sujet ! Du coup, je suis reste prudent et je me suis limite aux machines sur lesquelles j'ai travaille dans les deux langages. Mais puisque les deux langages imposent un modele, il ne devrait pas y avoir d'exception. Si tu as le temps, tu peux donner le chapter and verse du modele memoire C ?

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    C'est marrant, j'etais convaincu du contraire: que le Fortran imposait le column-major (et en effet c'est dans la norme), mais que la norme C ne disait rien sur le sujet ! Du coup, je suis reste prudent et je me suis limite aux machines sur lesquelles j'ai travaille dans les deux langages. Mais puisque les deux langages imposent un modele, il ne devrait pas y avoir d'exception. Si tu as le temps, tu peux donner le chapter and verse du modele memoire C ?
    C'est un corrolaire du fait qu'il n'y a pas de tableau multidimensionnel en C, simplement des tableaux de tableaux.

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par criga Voir le message
    [...]

    1) lorsque l'on remplit une matrice via 2 boucles (1 boucle sur les lignes et 1 boucle sur les colonnes), vaut-il mieux boucler d'abord sur les lignes ou d'abord sur les colonnes (quelle boucle doit être à l'intérieur de l'autre)?
    Pour des questions de performances, je pense qu'il est préférable de boucler d'abord sur les colonnes (indice de droite) puis sur les lignes. Les éléments sont à des adresses consécutives en mémoire, donc cela aide pour remplir une ligne cache.
    Citation Envoyé par criga Voir le message
    2) Est-il plus rapide d'accéder aux éléments d'un vecteur si celui a été déclaré comme:
    ou s'il a été déclaré comme pointeur puis avoir alloué la mémoire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double *Vecteur;
    Vecteur=(double*)malloc(N*sizeof(double));
    Dans les deux cas, il ne devrait y avoir aucune différence de perfo.

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    A part le cout de l'allocation dynamique, il ne devrait pas avoir de difference notable.
    Et celui de la libération

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    par contre, pour accèder, il est nettement plus rapide de calculer le début de ligne une seule fois au début de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for ( i = 0 ; i < nli ; i++ )
      {
         ind = i*nx ;
         ptab = &tab[ind][0] ;
     
         for ( j = 0 ; j < nx ; j++ )
           {
               ptab++ ;  /* ou tab[ind+j] si à une dimension */
           }
      }

Discussions similaires

  1. [WD17] Vitesse d'exécution d'un code
    Par Nathalie35000 dans le forum WinDev
    Réponses: 10
    Dernier message: 06/11/2013, 16h58
  2. Réponses: 8
    Dernier message: 01/01/2008, 20h38
  3. Interrompre l'exécution d'un code
    Par pgz dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/05/2006, 17h39
  4. Réponses: 4
    Dernier message: 02/04/2006, 18h42
  5. [Système] Forcer l'exécution d'un code php
    Par florent dans le forum Langage
    Réponses: 4
    Dernier message: 02/12/2005, 13h13

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