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 :

Une boucle bien mystérieuse


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 6
    Points
    6
    Par défaut Une boucle bien mystérieuse
    Bonjour,

    Tout nouveau en C (j'utilise Visual C++), je fais quelque expérimentations, notamment en vue de tester la célérité. Dans une triple boucle imbriquée (code ci-dessous), j'assiste à un phénomène bien étrange...

    La durée de calcul est, comme on s'y attend, proportionnelle à la limite supérieure des boucles sur k et sur i (indices des deux boucles "extérieures").
    Mais, contre toute attente, elle semble indépendante de la limite supérieure sur j!

    Je précise que ceci se produit lorsque je compile en mode "release".
    Lorsque je compile en mode "debug", mon chronomètre retrouve ses esprits et un pas à pas semble indiquer que tout se passe comme on s'y attend...

    Bref, je me plante quelque part, mais où ?

    Merci d'avance pour vos lumières !

    Note : chez moi, une valeur de 100000000 (100 millions) comme limite sur k donne un temps de calcul de l'ordre de 20s.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    long Multiplie(long x, long a)
    {return x*a+1;	
    }
     
    long Divise(long x, long a)
    {return x/a;
    }
     
    int main()
    {
     
    	long i, j, k, a, x;
    	long N, M;
    	printf("Limite sur k ?\n");
    	scanf("%d", &N);
           M = N/2;
    	a = 22533;
    	x = 25421;
    	for(k=0;k<=N-1;k++)
    	{
    		for (i=0; i<200;i++)
    		{
    			for(j=0; j<50;j++)
    			{
    				x = Multiplie(x,a);
    				x = Divise(x,a);
    				if (j==25 && i==100 && k==M) { printf("La moitie est traitee\n");}
    			}
    		}
    	}
    	printf("Termine !\n");
        return 0;
    }

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 6
    Points
    6
    Par défaut Peut-être ?
    Peut-être est-ce le compilateur qui est tellement bien fait qu'il se "rend compte" que la boucle sur j ne fait rien du tout (les autres non plus mais bon...) ?...

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Garocat Voir le message
    La durée de calcul est, comme on s'y attend, proportionnelle à la limite supérieure des boucles sur k et sur i (indices des deux boucles "extérieures").
    Mais, contre toute attente, elle semble indépendante de la limite supérieure sur j!

    Je précise que ceci se produit lorsque je compile en mode "release".
    Lorsque je compile en mode "debug", mon chronomètre retrouve ses esprits et un pas à pas semble indiquer que tout se passe comme on s'y attend...

    Bref, je me plante quelque part, mais où ?
    La valeur de x n'étant pas réellement utilisé dans ton programme et vu qu'il y a une opération de I/O uniquement lorsque j vaut 25, il est possible que lors de l'optimisation, le calcule sur x ait été supprimé et que la boucle sur j est tout simplement été virée pour ne garder que l'itération ou j == 25.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 6
    Points
    6
    Par défaut C'est bien ça
    Oui, c'est bien ça, merci !
    Quand je demande un calcul moins vide, tout redevient "normal". Impressionnant ce compilateur !

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

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. Une erreur bien mystérieuse
    Par guidav dans le forum Langage
    Réponses: 2
    Dernier message: 17/11/2006, 17h42
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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