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 :

Temps de calcul & méthode accès tableau


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 27
    Points
    27
    Par défaut Temps de calcul & méthode accès tableau
    Bonjour,

    Je travaille actuellement sur un bibliothèque d'analyse du mouvement sur des images 2D/3D dans le domaine médical, en temps réel : le temps de calcul est donc très important pour moi.

    En réorganisant d'un code existant en ajoutant des méthodes d’accès a un tableau (qui stocke dans mon cas les niveaux de gris d'une image), j'ai vu les performances se dégrader...

    Voici une simplification de la classe gérant l’accès au tableau:

    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
     
    class Image
    {
    public:
       float *data() { return data; }
     
       float& operator[](int index) { return data[index]; }
       const float& operator[](int index) const { return data[index]; }
     
       float& at(int index) { return data[index]; }
       const float& at(int index) const { return data[index]; }
     
    private:
       int width, height, depth;
       float *data;
    };
    Les performances associées a différentes méthodes d’accès sont les suivantes:

    • méthode "at()" : performance de l'algo 350ms
    • l’opérateur [] : performance de l'algo 150ms
    • accès au pointeur du tableau ("data()") puis accès classique avec l’opérateur [] : performance de l'algo 50ms


    L'algo en lui même est HornSchunck (estimation de mouvement), il ne contient aucun calculs complexes autre que +,-,/,*

    Est ce que quelqu'un aurait une explication sur ces différences de temps de calculs ?
    Quels conseils me donneriez-vous dans le cas d’accès rapide a un gros volume de données ?

    Merci d'avance,

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Bonjour,

    méthode "at()" : performance de l'algo 350ms
    -> à ma connaissance at fait quelques vérifications dont vérifier que l'élément existe (http://www.cplusplus.com/reference/stl/vector/at/).

    l’opérateur [] : performance de l'algo 150ms
    -> l'opérateur[] est redéfini, on appelle donc une méthode.

    accès au pointeur du tableau ("data()") puis accès classique avec l’opérateur [] performance de l'algo 50ms
    -> l'opérateur [] est celui de "base" donc pas d'appel à une méthode



    Sinon pour un tableau à plusieurs dimensions, tab[i][j][k]il vaut mieux parcourir les k, puis les j et en dernier les i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int i = 0; ... ; ++i)
              for(int j = 0; .... ; ++j)
                       for(int k = 0; .... ; ++k)
                                   ;//
    En effet, lorsqu'on charge des données dans le cache du CPU, on charge un bloc de donnée donc on a aussi des données "adjacentes" ceci permet donc de réduire les chargement de données dans le cache du CPU.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    méthode "at()" : performance de l'algo 350ms
    -> à ma connaissance at fait quelques vérifications dont vérifier que l'élément existe (http://www.cplusplus.com/reference/stl/vector/at/).
    --> je n'utilise pas la classe standard vector donc j'ai fais ma propre fonction at() comme définie auparavant (pas test supplémentaire) que la seconde

    l’opérateur [] : performance de l'algo 150ms
    -> l'opérateur[] est redéfini, on appelle donc une méthode.
    --> certes l’opérateur est redéfini mais la méthode étant inline (j'ai oublié de le préciser) elle n'est pas plus "longue" que la méthode d’accès de base our moi (je me trompe peut être) ; et même dans votre cas, comment peut on expliquer une telle différence de temps de calcul entre les 2 premières méthodes alors qu'elles font exactement la même chose ... ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Question bête : le code est bien compilé en -O3 ?
    Quelle est la version du compilo ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Réponse bête : NON merci en effet, c'est beaucoup beaucoup beaucoup mieux ....
    Merci cob59 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. temps de calcul sius VC++ !!
    Par Axiome dans le forum MFC
    Réponses: 16
    Dernier message: 13/12/2005, 10h57
  2. Temps de calcul avec deux écrans
    Par Shaga dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/11/2005, 10h24
  3. Réponses: 11
    Dernier message: 29/04/2005, 20h45
  4. temps de calculs extremement long !!
    Par salseropom dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2005, 21h12
  5. Split et calcul de ligne du tableau
    Par La_picolle dans le forum ASP
    Réponses: 6
    Dernier message: 27/08/2003, 16h58

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