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'exécution et multiplication par 2


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut temps d'exécution et multiplication par 2
    Bonjour

    Ce bout de codeet celui-cifont la même chose : multiplier a par 2. Par contre, quel est le code le plus rapide à l'exécution et comment le vérifier ?

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Moi je commencerais déjà par désassembler tout ça pour voir comment le compilateur l'a optimisé. Ensuite, si tu n'arrives toujours pas à voir, il reste la méthode itérative : tu lances 1 000 000 000 de multiplications avec les 2 méthodes et tu compares les temps d'exécutions sachant que de toutes façons ça peux varier en fonction de ton compilateur, de ton architecture, ...

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Mon avis : ne te prend pas la tête.

    Ecrit un code simple à comprendre et en accord avec ton contexte de développement.

    Si dans ton contexte, l'instruction "*" a plus de sens que "<<" utilise la multiplication, si tu manipules des bits, utilise l'instruction "<<".

    Après c'est le boulot de l'optimiseur de changer/remplacer certaines instructions par d'autres parce qu'il sait que celle la va plus vite et fait le même boulot que l'autre.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par corentin59 Voir le message
    Bonjour

    Ce bout de codeet celui-cifont la même chose : multiplier a par 2. Par contre, quel est le code le plus rapide à l'exécution et comment le vérifier ?
    C'est la même chose, à part peut-être si tu utilises un compilateur complètement dépassé. La plupart des compilateurs sont capables de simplifier aussi n'importe quelle multiplication ou division par constante.

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Le code suivant:

    Code C : 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
    int f1(int n)
    {
        int res = 2 * n;
        return res;
    }
     
    int f2(int n)
    {
        int res = n << 1;
        return res;
    }
     
    int main(void)
    {
        f1(100);
        f2(100);
        return 0;
    }

    donne (après compilation avec gcc -S -O2 -c):

    Code Asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    _f1:
    	pushl	%ebp
    	movl	%esp, %ebp
    	movl	8(%ebp), %eax
    	popl	%ebp
    	addl	%eax, %eax
    	ret
    et
    Code Asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    _f2:
    	pushl	%ebp
    	movl	%esp, %ebp
    	movl	8(%ebp), %eax
    	popl	%ebp
    	addl	%eax, %eax
    	ret

    On voit que le code généré est strictement identique dans les deux cas. Et même avec un niveau d'optimisation -O0, gcc génère un code identique pour f1() et f2():

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$16, %esp
    	movl	8(%ebp), %eax
    	addl	%eax, %eax
    	movl	%eax, -4(%ebp)
    	movl	-4(%ebp), %eax
    	leave
    	ret

    Donc, inutile de se tourmenter avec ce genre de micro-optimisations qui ne t'apportera pas grand chose. L'essentiel est d'écrire du code lisible et de se concentrer sur l'optimisation au niveau du choix et de la conception de l'algo.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    OK, merci pour vos réponses.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Code Asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    _f1:	pushl	%ebp
    	movl	%esp, %ebp
    	movl	8(%ebp), %eax
    	popl	%ebp
    	addl	%eax, %eax
    	ret
    Et même si mes souvenirs en assembleurs ne sont pas trop rouillés, l'optimiseur a remplacé dans les 2 cas la multiplication et le décalage par une addition

    Code Asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    addl	%eax, %eax
    Cela revient à ajouter dans eax, le contenu de eax donc à multiplier par 2 le registre eax. L'optimiseur pense donc que dans ce cas, une addition est encore plus rapide.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    NairodDorian
    Invité(e)
    Par défaut
    Par contre, quel est le code le plus rapide à l'exécution [...]
    ça dépend sur quel processeur tu veux faire tourner ce code.
    Si tu as un processeur Intel Pentium III l'instruction shl sera plus rapide que mul et add par contre si tu tournes sur un processeur Intel récent Pentium 4 et après l'instruction add est plus rapide que mul et shl.

    Une petite remarque aussi sur la fonction codé par Thierry :
    sa fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int f1(int n)
    {
        int res = 2 * n;
        return res;
    }
    Devrait être écrite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned int __fastcall f1(unsigned n)
    {
    return n << 1;
    }
    Voilà...

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Une petite remarque aussi sur la fonction codé par Thierry :
    sa fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int f1(int n)
    {
        int res = 2 * n;
        return res;
    }
    Devrait être écrite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned int __fastcall f1(unsigned n)
    {
    return n << 1;
    }
    Voilà...
    Pourquoi?

    Je fais confiance aux qualités d'optimiseur de mon compilo.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par corentin59 Voir le message
    Ce bout de codeet celui-cifont la même chose : multiplier a par 2. Par contre, quel est le code le plus rapide à l'exécution et comment le vérifier ?
    N'oublie pas que le code source n'est une déclaration d'intention à l'encontre du compilateur, qui lui, écrit le code machine qui va bien. Il est fort probable que les 2 codes sources donnent le même code machine avec un compilateur moderne... Tu ne verras donc pas la différence.

    Si tu veux la voir, il faut coder en assembleur.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 22/05/2014, 16h31
  2. Réponses: 1
    Dernier message: 27/03/2008, 18h42
  3. Réponses: 2
    Dernier message: 25/05/2004, 15h33
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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