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 :

parcourir un tableau


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut parcourir un tableau
    Bonjour,

    Pour parcourir un tableau, il existe plusieurs méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int myTab[1000] = {......};
    int *ptInt;  // pointeur
    int cpt = 1000;
     
    ptInt = myTab;
    while(cpt){
        printf("%d\n", *ptInt);
        cpt--;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int myTab[1000] = {......};
    int i;
     
    for(i=0; i<1000: i++){
       printf("%d\n", myTab[i]);
    }
    => pouvez-vous (m'expliquer) me dire quelle est la méthode qui est la plus rapide ? il existe d'autres méthodes plus rapides ?

  2. #2
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    Bonjour,

    Pour parcourir un tableau, il existe plusieurs méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int myTab[1000] = {......};
    int *ptInt;  // pointeur
    int cpt = 1000;
     
    ptInt = myTab;
    while(cpt){
        printf("%d\n", *ptInt);
        cpt--;
    }
    Ce code affiche mille fois le 1er élément de ton tableau.
    Essaie plutot ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int myTab[1000] = {......};
    int *ptInt;  // pointeur
    int cpt = 1000;
     
    ptInt = myTab;
    while( cpt-- ){
        printf("%d\n", *ptInt++);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int myTab[1000] = {......};
    int i;
     
    for(i=0; i<1000: i++){
       printf("%d\n", myTab[i]);
    }
    => pouvez-vous (m'expliquer) me dire quelle est la méthode qui est la plus rapide ? il existe d'autres méthodes plus rapides ?
    Ca dépend de ton compilo et du niveau d'optimisation, mais sur à peine 1000 éléments, je ne pense pas qu'il y ait une différence sensible.

  3. #3
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    J'ai modifié ton exemple et les différences commence à apparaitre avec 1000000 d'éléments... et encore sans optimisation...

    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
     
    /* gcc -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ..\main.c
     * gcc -otest_c.exe main.o
     */
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
     
     
    #define MAX_ELEMENT 1000000
     
    void test3()
    {
    	char buf[40];
    	int* myTab = (int*)malloc(MAX_ELEMENT * sizeof(int));
    	int *ptInt;
    	int cpt = MAX_ELEMENT;
     
    	ptInt = myTab;
    	while( cpt-- )
    	{
    	    sprintf(buf,"%d\n", *ptInt++);
    	}
    	free(myTab);
    }
     
    void test4()
    {
    	char buf[40];
    	int* myTab = (int*)malloc(MAX_ELEMENT * sizeof(int));
    	int i;
     
    	for(i=0; i<MAX_ELEMENT; i++)
    	{
    	   sprintf(buf,"%d\n", myTab[i]);
    	}
    	free(myTab);
    }
     
    int main()
    {
    	clock_t tp = clock();
    	test3();
    	printf("test3=%f s.\n", (float)(clock() - tp)/CLOCKS_PER_SEC);
    	tp = clock();
    	test4();
    	printf("test4=%f s.\n", (float)(clock() - tp)/CLOCKS_PER_SEC);
    	return 0;
    }

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    ok merci

  5. #5
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Mon avis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while( cpt-- ) // une opération (--)
    	{
    	    sprintf(buf,"%d\n", *ptInt++); // 2e opération (++)
    	}
    -> Deux opérations d'ajout/soustraction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i=0; i<MAX_ELEMENT; i++) // 1 opération
    	{
    	   sprintf(buf,"%d\n", myTab[i]);
    	}
    -> 1 seule opération d'ajout

    On a moins d'opérations dans la deuxième boucle, du coup elle sera plus rapide.
    Chez moi:
    test3=0.141000 s.
    test4=0.109000 s.
    Dans tous les cas, je pense que ça ne devient évident qu'à partir d'un nombre élevé d'itérations car les "++" et les "--" vont opérer sur une variable stockée dans un registre. Les accès mémoire, eux, sont plus longs et effacent totalement ce petit lag d'une opération en plus.

    Pour en être sûr faudrait regarder l'assembleur.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par Gui13 Voir le message
    Pour en être sûr faudrait regarder l'assembleur.
    => oui effectivement, c'est la meilleur solution

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

Discussions similaires

  1. Parcourir un tableau?
    Par kanzarih dans le forum Oracle
    Réponses: 2
    Dernier message: 19/01/2006, 19h45
  2. Meilleure Méthode pour parcourir un tableau
    Par KPitN dans le forum MFC
    Réponses: 7
    Dernier message: 24/02/2005, 16h19
  3. Comment parcourir un tableau
    Par petitsims dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/01/2005, 14h33
  4. parcourir un tableau aléatoirement
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/12/2004, 13h44
  5. [langage] Parcourir un tableau
    Par Jibees dans le forum Langage
    Réponses: 13
    Dernier message: 22/04/2003, 14h18

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