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 d'execution


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 114
    Par défaut Temps d'execution
    Je suis en train d'essayer d'optimiser un programme que j'ai du faire.
    A mon avis le temps d'execution entre :
    a = a + 5;
    et a += 5;
    est le même mais je voudrais confirmation.

    Je precise que ce genre d'opération est effectué des milliers de fois.

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Normalement c'est le même.
    Je pense que les compilos optimisent cela.
    A vérifier.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Houla, c'est pas là dessus que tu feras des optimisations ^^
    Montre ta boucle qui s'execute plein de fois

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 114
    Par défaut
    Voilà une partie que je dois surement pouvoir optimiser.
    Dans chaque case de mon tableau M, je voudrais insérer un bloc de 32 bits que j'ai lu dans un fichier.
    J'ai procéder de la maniere suivante:
    -lecture de 4 caractères consécutifs
    -addition de ces caractères après avoir effectuer le décalage de bits

    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
    unsigned char octet;
    unsigned long int octetLong;
    unsigned long int * M;
    M = (unsigned long int *)malloc(16*sizeof(uint4));
     
    [........]
     
        for(i=0;i<16;i++)
        {
            octetLong=0;
            for (j=0;j<4;j++)
            {
                fscanf(f,"%c",&octet);
                octetLong = octetLong + (octet << (32-8*(j+1)));
            }
            *(M+i)=octetLong;
        }

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 251
    Par défaut
    Citation Envoyé par guintolli
    Je suis en train d'essayer d'optimiser un programme que j'ai du faire.
    A mon avis le temps d'execution entre :
    a = a + 5;
    et a += 5;
    est le même mais je voudrais confirmation.

    Je precise que ce genre d'opération est effectué des milliers de fois.
    En effet ceci est un simple raccourci "d'écriture".

    Citation Envoyé par guintolli
    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
    unsigned char octet;
    unsigned long int octetLong;
    unsigned long int * M;
    M = (unsigned long int *)malloc(16*sizeof(uint4));
     
    [........]
     
        for(i=0;i<16;i++)
        {
            octetLong=0;
            for (j=0;j<4;j++)
            {
                fscanf(f,"%c",&octet);
                octetLong = octetLong + (octet << (32-8*(j+1)));
            }
            *(M+i)=octetLong;
        }
    Personnellement, dans le soft de l'electronique embarqué, pour gagner en temps d'exécution on déroule les boucles. Ici les boucles ne sont pas excessivement longue ça reste du domaine du possible. De plus la taille du code n'est généralement pas un problème si tu es sur un PC.

    A bientôt,
    Vincent

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 114
    Par défaut
    D'accord pour le déroulement des boucles.
    Il ne serait pas possible (plus rapide) aussi de lire directement 4 octets et de les insérer dans mon tableau sans avoir besoin de passer par un décallage de bits?
    Où d'avoir quelque chose de plus rapide que le fscan?

  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 guintolli
    Il ne serait pas possible (plus rapide) aussi de lire directement 4 octets et de les insérer dans mon tableau sans avoir besoin de passer par un décallage de bits?
    Ben oui, je pense que c'est la meilleure solution. Et meme de lire directement un bloc de de 16 mots (en utilisant "fread" par exemple) .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( fread(M, sizeof *M, 16, f) != 16 ) {
        perror("fread");
        exit(1);
    }

  8. #8
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Peut-être passer par une union :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    union CHAR4_INT32 {
    unsigned char c[4];
    unsigned int i;
    };
    tu lui affecte 4 octets d'un coup via i

    tu echange les octets via le tableau de char

    tu recupere l'entier par i

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 114
    Par défaut
    Il y a un truc que je ne comprend pas. Si au lieu de faire une boucle et de lire 4 caratère indépendant je fais:
    fread(&t,sizeof(char),4,fichier)

    Dans mon fichier il y a abcd, t va contenir dcba. C'est bormal que lors de la lecture de 4 caractères mes caractères se trouve inversés?

    Euh pour l'union je voit pas trop

  10. #10
    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 guintolli
    Il y a un truc que je ne comprend pas. Si au lieu de faire une boucle et de lire 4 caratère indépendant je fais:
    fread(&t,sizeof(char),4,fichier)

    Dans mon fichier il y a abcd, t va contenir dcba. C'est bormal que lors de la lecture de 4 caractères mes caractères se trouve inversés?

    Euh pour l'union je voit pas trop
    Tout dépend la façon dont tu as écris ton fichier.
    Si tu es sur une plateforme x86 et que :
    - l'écriture a été faite octet par octet (a, b, c, d), alors tu dois relire la même chose (toujours octet par octet)
    - l'écriture a été faite en "int" (abcd), alors la lecture octet par octet va donner "dcba", car tu es sur une platefore little endian.
    Donc si tu ne veux pas avoir d'ennuis de ce type, je te conseille de relire ton fichier tel que tu l'as écrit (avec les mêmes types).
    Et si c'est un fichier que tu as récupéré, alors dans ce cas il faut connaître son format.

Discussions similaires

  1. limit et temps d'execution avec oracle et PHP
    Par dor_boucle dans le forum Oracle
    Réponses: 20
    Dernier message: 10/12/2005, 14h31
  2. Temps d'execution d'un select sur une vue
    Par rosewood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/02/2005, 16h06
  3. Temps d'execution d'une requête
    Par Maglight dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/01/2005, 08h38
  4. [VB.NET] Temps d'éxécution d'une page...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/06/2004, 12h20
  5. Connaitre le temps d'execution d'un pgm ?
    Par yacinechaouche dans le forum C
    Réponses: 7
    Dernier message: 27/01/2003, 20h57

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