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 :

Optimisation d'une boucle for


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    UVSQ
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : UVSQ
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Optimisation d'une boucle for
    Bonjour,
    Je sollicite votre aide, je suis debutant et je voudrais savoir comment on peut optimiser ce bout de code
    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
     
    for (k = 0; k < 20; k++)
        {
        for (i = 1; i <= size; i++)
          {
          for (j = 1; j <= size; j++)
            {
            x[fonction(i, j, size)] = 
            (a * ( x[fonction(i-1, j, size)] + x[fonction(i+1, j, size)]
             +
             x[fonction(i, j-1, size)] + x[fonction(i, j+1, size)])
             +  
             x0[fonction(i, j, size)]) / c;
            }
          }
        fonction(b, x, size);
        }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut


    • Supprimer ta première boucle parce que k n'intervient pas dans les calculs (tu fais k fois la même chose )
    • Tu sors tes cours de mathématiques pour simplifier ton addition pondérée des proches en croix (... je pense à des sommes partielles)

  3. #3
    Candidat au Club
    Homme Profil pro
    UVSQ
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : UVSQ
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Justement a chaque tour de la boucle K j'execute une instruction, sinon je n'ai pas comrpis ce que vous vouliez dire pour le second point.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    les maths c'est pas mon fort par contre je me dis que les appels de fonction() doivent couter cher, alors que quand on a fonction(i+1, j+1), au tour de boucle j suivant on relance le même calcul avec fonction(i+1, j), et idem pour i
    du coup avoir un tableau temp[i*j] permettrait d'effectuer des accès mémoire au lieu de calculs potentiellement lourds, ça vaut peut-être la peine de creuser...

  5. #5
    Candidat au Club
    Homme Profil pro
    UVSQ
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : UVSQ
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Voila donc j'ai reussi a virer les appels de fonctions et la boucle k, y a t-il un moyen d'optimiser encore plus?
    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
     
    for (i = 1; i <= grid_size*20 ; i++)
          {
          for (j = 1; j <= grid_size; j++)
            {
            x[ i % grid_size + 1 + (grid_size + 2) * j] 
            = 
            (a * ( x[ i % grid_size + (grid_size + 2) * j] + x[ i%grid_size + 2 + (grid_size + 2) * j]
             +
             x[ i % grid_size + 1  + (grid_size + 2) * (j-1)] + x[ i % grid_size + 1 + (grid_size + 2) * (j+1)])
             +  
             x0[ i % grid_size + 1 + (grid_size + 2) * j]) / c;
            }
    		if( (i % 20 == 0))
    		function(b, x, grid_size);
        }

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    Tu calcules souvent i % grid_size et grid_size + 2.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Candidat au Club
    Homme Profil pro
    UVSQ
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : UVSQ
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Le i%size est du a la suppression de la boucle k->20 ,et je ne vois pas comment l'optimiser, sinon pour grid_size + 2 il suffira de la stocker dans une variable.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,
    Citation Envoyé par louyxv Voir le message
    Le i%size est du a la suppression de la boucle k->20 ,et je ne vois pas comment l'optimiser, sinon pour grid_size + 2 il suffira de la stocker dans une variable.
    idem pour l'autre, puisque tu la recalcules plusieurs fois dans le même bloc.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par louyxv Voir le message
    Voila donc j'ai reussi a virer les appels de fonctions et la boucle k, y a t-il un moyen d'optimiser encore plus?
    difficile à dire, ça parait évident pour toi qui connais le code, mais vu d'ici je comprends pas un brin ce qu'est censé faire ce bout de code incomplet et qui pourrait bien être faux qui plus est (devrait pas y avoir un tableau glissant quelque part ?), tu dis que tu fais sauter la boucle k avec un modulo, pourquoi pas...

    et avant de vouloir optimiser plus, est-ce que tu as testé ? quel est le gain concrètement ?

  10. #10
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Donne aussi le compilateur utilisé, sa version ainsi que les options donnés.

  11. #11
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    en attendant ta réponse sur les questions de mes vdd, j'imagine quand même que tu essayes de faire une convolution avec
    Formule mathématique
    J'imagine également que tu utilises un tableau 1D pour stocker ton image, que Fonction permet de passer des coordonnées 2D en 1D.

    Donc la première chose que je dirai est : pourquoi faire une double boucle avec des appels à Fonction alors qu'une seule boucle suffirait ? OK, il n'y aurait pas moins de tours de boucle mais tu t'affranchirais carrément de l'appel à Fonction (la case du dessus est obtenue en retranchant size, au détails d'implémentation près, celle du dessous en ajoutant size, celle de gauche en retranchant 1, …).
    Ça c'est le plus choquant. Ensuite garde ta boucle externe, pas la peine de rajouter un calcul de modulo.

    Maintenant pourquoi vouloir précisément optimiser cette partie ? On optimise pas par hasard, on optimise les morceaux de code qui sont intéressant à optimiser = ceux qu'un outil (comme gperf) nous a permis d'isoler par exemple.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par picodev Voir le message
    tu essayes de faire une convolution avec
    Formule mathématique
    Même si ce ne sont que des suppositions, cela me fait doucement rire lorsqu'il n'a pas compris mon "sors tes cours de mathématiques"

    Effectivement, on voit bien qu'il fait des sommes pondérées des voisins en croix (haut, bas, gauche et droite)

    Mais comme l'a dit BufferBob , difficile de répondre plus parce que c'est à l'intérieur de fonction qui se passe un changement qui oblige k calculs.

  13. #13
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Oui, et c'est pour cela que je lui conseille de garder sa boucle externe et de ne pas essayer de l'intégrer dans les autres boucles à coup de modulo …

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

Discussions similaires

  1. Optimisation d'une boucle for
    Par Novice_vba dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 24/07/2013, 15h20
  2. Optimisation d'une boucle for each
    Par misscricri dans le forum VB.NET
    Réponses: 3
    Dernier message: 25/01/2012, 23h06
  3. erreur pendant l'optimisation d'une boucle for
    Par bakaratoun dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/01/2010, 14h44
  4. Optimisation d'une boucle for
    Par Vorlane dans le forum MATLAB
    Réponses: 0
    Dernier message: 07/07/2009, 11h36
  5. optimiser mon code avec une boucle for?
    Par Invité dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/11/2007, 08h33

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