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 en terme de temps d'exécution


Sujet :

C

  1. #21
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par fcharton Voir le message
    Ca, c'est pas vrai. Si les créateurs du C l'avaient voulu, ils auraient aisément pu obliger, par standard, if() à prendre un argument intégral (le standard le prévoit pour switch()). Comme x!=0.0 renvoie un int, la première formulation aurait été légitime et pas la seconde.
    Oui, mais sans type booléen ça n'a pas plus de sens.

    Citation Envoyé par fcharton Voir le message
    Mais ce ne serait pas logique. En C, toute expression renvoie une valeur. x!=0.0 renvoie un entier, x (dans ce cas) un flottant. Et if() teste la nullité de son argument (pour tout type scalaire).
    En C oui, mais ce n'est pas naturel. En langage courant "if x" veut dire "si x est vrai" pas "si x est non-nul". Ou alors il aurait fallu nommer le mot-clé "if_not_null".

    Citation Envoyé par fcharton Voir le message
    (De plus, si on obligeait if() à prendre un int pour argument, je soupconne que l'instruction if(0.5) serait toujours vraie, 0.5 étant converti en int, et donc égal à zéro...)
    Effectivement, d'où le choix retenu.

    Citation Envoyé par fcharton Voir le message
    Je pense en revanche que ce genre de test est potentiellement dangereux, car la représentation flottante des nombres peut introduire des erreurs d'arrondi. Mais, si l'on va par là, il faudrait quasiment abandonner les flottants...
    Et les entiers aussi, car en matière d'arrondi ils font pire. Mais c'est un autre problème.

  2. #22
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le fait que le standard Ansi C ne possède pas un type booléen ne signifie pas qu'il n'a pas la notion de booléens. Il y a des endroits où est attendu une expression à caractère booléen, c'est à dire ayant pour valeur "Vrai" ou "Faux" et peu importe la représentation des booléens.

    Même si langage ne nomme pas le type "booléen", ni les valeurs "Vrai" ou "Faux" (ce sont finalement les seules choses qui manquent), je considère que le type "booléen" existe dans les faits. La preuve pour moi est qu'il existe des expressions de ce type et des opérateurs particuliers à ce type :

    - C'est le cas de l'expression figurant dans un if, un while, un do while et de la seconde expression d'un for (mais évidemment pas l'expression figurant dans un switch).
    - Le résultat d'une expression utilisant les opérateurs de comparaison est aussi booléen.
    - C'est aussi le cas des opérandes des opérateurs &&, || et ! et le résultat est booléen.

    Le fait que certaines valeurs se "transtype" automatiquement en "Vrai" ou "Faux" n'apporte pas de la clarté dans l'écriture du code et comme on n'est pas à quelques caractères en plus ou en moins, je préfèrerais toujours écrire
    plutôt que

  3. #23
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    fcharton :
    Pour les if, il est possible que le ralentissement vienne du fait que ton code crée des défauts de cache (cache miss). Si ta boucle ne tient pas dans le cache d'instructions de ton processeur, un if va causer un rechargement de celui ci, qui le ralentit beaucoup.
    C'est ce que je suggérais dans mon post #8.
    Le problème peut plutôt venir du fait que le tableau entier lui-même ne tienne pas dans le cache. Seuls les éléments obtenus en variant le deuxième indice sont contigüs en mémoire et ont toutes les chances de se trouver tous simultanément dans le cache. Une variation du premier indice change complètement le bloc mémoire utilisé et peut provoquer un rechargement du cache. Ceci peut être extrêmement pénalisant.

Discussions similaires

  1. optimisation en temps d'exécution d'un tri
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/03/2008, 18h49
  2. [datenum] Optimiser le temps d'exécution
    Par xduris dans le forum MATLAB
    Réponses: 11
    Dernier message: 08/08/2007, 16h07
  3. Optimisation du temps d'exécution d'une requête
    Par LeNovice dans le forum DB2
    Réponses: 6
    Dernier message: 12/07/2007, 13h47
  4. optimiser le temps d'exécution de l'explorateur windows
    Par ben_iap dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 31/01/2006, 22h04
  5. Réponses: 9
    Dernier message: 20/06/2005, 12h17

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