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

Langage Delphi Discussion :

variables locales et temps d'execution


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut variables locales et temps d'execution
    Bonjour,

    J'ai une procédure b imbriquée dans la procédure a.
    J'ai des variables locales x, y, z dans b et celle-ci sera appelée des milliers de fois tandis que a ne sera appelée qu'une fois au départ.
    Où définir x, y, z pour que le temps d'exécution diminue ? dans a ou dans b ?

    Merci d'avance,

    fred

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Tout dépend des types de variables :

    Type scalaires : Dans b
    Car si elles sont transformées en registre CPU par l'optomisation ça gagnera plus de temps. Si elles ne le sont pas le temps sera le même car l'accès à une variable locale de a ou de b une fois compilé revient toujours à un [EBP+offset]

    Type chaines/tableaux dynamiques : dans a
    La règle ci-dessus va s'appliquer, mais en plus à chaque appel de B du code d'initialisation et de finalisation sera ajouté implicitement par le compilateur.

    Objets (comme un TStringList de travail) : Dans a
    Même principe que pour le cas ci-dessus sauf que c'est toi qui ajoute explicitement le code d'initialization/finalisation.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Bravo Mr NONO, répondre à 3H30 du mat, c'est beau sauf si vous êtes comme moi "loin" de France....
    Bon, ce sont des entiers et réels, il n'y en a pas beaucoup (6 en tout), je les définirai donc dans b. Mais c'était une question + générale sur l'emplacement optimal. De plus il vaut mieux les garder dans b pour une meilleure lisibilité du programme.

    Merci encore,

    Fred

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Non non je suis bien un Français en France. Mais je n'ai pas des horaires 'normaux'

    Qu'est ce que tu fais comme type de calcul dans B ?
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    attention tout de même, l'appel d'une variable locale à a depuis b demande une référence de plus; on va chercher dans la pile de l'appelant et pas simplement à un offset donné, en effet b pourrait être appelé récursivement, ou depuis d'autres fonctions locales à a...avec une pile dans un état différent à chaque fois et un offset qui ne veux plus rien dire.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Excusez-moi, je croyais que la discussion était fermée puisque j'ai eu une réponse à ma question.
    Mon programme est la simulation d'un séisme horizontal sur un pont protégé par des dispositifs parasismiques.
    Dans b, je calcule les forces fournies par différents éléments à chaque pas de temps de calcul, sachant que le temps total d'un séisme est d'environ 30s et que le pas de temps de calcul est inférieur à 0.1ms.

    Fred

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    J'ajouterai que, comme l'envisageait Mr Paul TOTH, b est appelé à différents endroits de a (qui est la procédure principale du calcul).

    Fred

  8. #8
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Citation Envoyé par AlfredKr Voir le message
    Où définir x, y, z pour que le temps d'exécution diminue ? dans a ou dans b ?
    Il ne doit pas être très difficile de programmer les deux méthodes, ni de mesurer les temps d'éxécution.
    Par contre il doit être beaucoup plus difficile de mesurer une différence, tant elle doit être petite.
    Tu essaies et tu nous tiens au courant ?
    Merci
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Bonjour Nebulix,

    C'est ce que je voulais faire hier après avoir envoyé mes réponses. Dès que je l'aurai mesuré, je vous tiendrai au courant.

    Fred

  10. #10
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    si c'est la performance que tu cherche il ne faut surtout pas utiliser de fonction locale.

    car à chaque calcul on se retrouve avec un CALL qui est anti-performant.

    soit tu utilise une fonction externe (portée globale) mais INLINE (D2009/D2010)
    soit tu intègre la fonction à la boucle.

    le mieux aurait été de nous montrer le code pour pouvoir t'indiquer toutes les optimisations faisable.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Merci pour ta réponse, Dr Who.
    Je ne sais pas ce qu'est une fonction externe inline.
    Inline voulait dire "à définir sur une ligne" en C++ je crois,
    est-ce pareil en delphi (2010) ? ma fonction b est longue d'environ 100 lignes. elle apparaît 5 fois dans la fonction a, donc la ré-ecrire 4 fois, me semble lourd mais envisageable (je perds l'intérêt d'utiliser une fonction.
    Pour vous montrer la procédure a, je veux bien, mais elle utilise des éléments finis et est tout un calcul de résolution d'un système d'équations différentielles du 2eme ordre qui n'a pas d'intérêt dans ce forum. De plus la proc est trop longue.

    Fred

  12. #12
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par AlfredKr Voir le message
    Pour vous montrer la procédure a, je veux bien, mais elle utilise des éléments finis et est tout un calcul de résolution d'un système d'équations différentielles du 2eme ordre qui n'a pas d'intérêt dans ce forum. De plus la proc est trop longue.
    Eh bien tu as ta réponse : ce n'est l'overhead d'appel de ta procédure B qui est le bottleneck de tes performances. Il faut voir de manière globale une optimisation plus drastique.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. Gain de temps, variables locales
    Par KiwiwiK dans le forum MATLAB
    Réponses: 8
    Dernier message: 19/03/2015, 13h41
  2. Réponses: 1
    Dernier message: 30/06/2008, 17h01
  3. SELECT : temps d'execution variable
    Par guizmo_ dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/05/2008, 11h11
  4. Connaitre le temps d'execution d'un pgm ?
    Par yacinechaouche dans le forum C
    Réponses: 7
    Dernier message: 27/01/2003, 20h57
  5. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22

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