Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Boucle ou GOTO : lequel est le plus rapide ?



  1. #1
    Konrad

    Boucle ou GOTO : lequel est le plus rapide ?


    ------

    Bonjour à tous les programmeux

    J'ai pour habitude de programmer de petits programmes en FORTRAN (oui je sais ce que tout le monde en pense... mais programmation scientifique oblige), et je me pose une question assez générale sur la programmation : vaut-il mieux utiliser des boucles (DO...ENDDO, DOWHILE...ENDDO, etc.) ou bien des labels et des instructions GOTO xxx ? Lequel des deux est le plus efficace ?

    Et parallèlement, je me demande si cela dépend du langage de programmation utilisé ? Et aussi, est-ce que ça dépend de l'architecture du processeur sur lequel on exécutera le programme ? Je me doute que cela doit jouer, mais je ne vois pas du tout dans quelles proportions...


    Merci d'avance à ceux qui sauront me répondre

    -----
    "Un clavier AZERTY en vaut deux."

  2. Publicité
  3. #2
    fderwelt

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Bonjour,

    Avec un bon compilo, c'est exactement pareil. Simplement le DO ... END DO est nettement plus lisible!

    Par ailleurs, il se peut même (avec un compilo pas terrible) que le GO TO soit moins efficace. Les processeurs de maintenant ont des instructions optimisées pour ce genre de structures, et sans indication claire de la structure de la boucle le compilo peut ne pas "penser" à les utiliser.

    Par exemple la machine type MIX (version moderne) de Knuth a des instructions du style "Probable Branch if Zero", dont on peut anticiper qu'elles vont provoquer un branchement dans la grande majorité des cas, et donc anticiper le chargement de l'instruction suivante. On n'aura perdu un cycle qu'à la toute dernière itération.

    Cela dit, je pense que, pour la même raison, c'est valable dans tous les langages. FORTRAN est peut-être plus sensible parce que les applications numériques sont très gourmandes en boucles.

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  4. #3
    Septentrion

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Quand on fait du calcul scientifique lourd, il y a quelques bonnes habitudes à prendre pour optimiser l'utilisation des caches mémoire même depuis un langage de haut niveau, et on peut aussi tenir compte du fait que les processeurs récents exécutent des instructions en parallèle. Et le processeur peut aussi avoir un mécanisme de prédiction de branchements.
    Il est aussi très instructif d'examiner le code assembleur produit par le compilateur pour en déduire des bonnes pratiques.
    Le mieux est d'expérimenter un peu, ça dépend du compilateur, du processeur, etc.

    J'ai déjà vu des gains importants sur des calculs de type transformée de Fourier, multiplication de matrices, etc. si on fait attention à écrire correctement la boucle interne en tenant compte de la façon dont ça va être compilé.

    A+

  5. #4
    plath

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Bonjour à tous,

    En fait les boucles avec des labels et des GOTO font partie de l'arsenal du Fortran 77 qui ne connait pas les DO WHILE et autre boucles de ce style.
    Les DO WHILE sont caractéristiques du Fortran 95.
    Par ailleurs il n'est pas interdit avec F95 de se servir des labels et GOTO mais comme l'a dit fderwelt c'est beaucoup plus lisible d'utiliser les boucles "recentes".
    Voila
    @ +
    PLATH

  6. A voir en vidéo sur Futura
  7. #5
    domlefebvre

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par plath Voir le message
    Bonjour à tous,

    En fait les boucles avec des labels et des GOTO font partie de l'arsenal du Fortran 77 qui ne connait pas les DO WHILE et autre boucles de ce style.
    Les DO WHILE sont caractéristiques du Fortran 95.
    Par ailleurs il n'est pas interdit avec F95 de se servir des labels et GOTO mais comme l'a dit fderwelt c'est beaucoup plus lisible d'utiliser les boucles "recentes".
    Voila
    @ +

    Bonsoir,

    Juste pour corriger une grosse erreur : FORTRAN 77 comporte les boucles do while et do enddo dans sa syntaxe....
    Voir par exemple www.tangenteX.com pour une initiation à la physique numérique en FORTRAN 77

  8. #6
    Konrad

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    OK, je commence à y voir plus clair... Merci pour vos réponses

    J'utilise le compilateur d'Intel, et sur le cluster du labo de compilo PGF95. Ces compilateurs sont assez réputés et doivent donc être assez véloces et optimisés, donc d'après vous les boucles sont préférables à des instructions GOTO, mais la différence n'est pas flagrante si le compilo est bon.
    "Un clavier AZERTY en vaut deux."

  9. Publicité
  10. #7
    abracadabra75

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Bonsoir.
    quelque soit le langage, un point à ne pas négliger est la clarté du programme.
    Les 'GOTO' présentent le danger de permettre des branchement 'sauvages' vers un point donné depuis de multiples origines. Cela aboutit à un fouillis par fois inextricable, surtout si c'est un gros programme.
    Une méthode de programmation dite ' structurée' interdit strictement les goto remplacés par des boucles. ces boucles sont alors analogues à des fonctions, ce qui permet de dérouler le programme linéairement. on y gagne en clarté car la boucle revient toujours à sa fin, à l'instruction qui suit l' appel.
    Si dans x temps il faut modifier le programme, c' est alors bien plus facile, et minimise les risques d'erreurs de logique.
    Au point de vue temps, vu la vitesse des processeurs actuels, il faudrait faire tourner en comparaison les 2 types de programmes pendant des heures durant pour pouvoir estimer les gains de l'un par rapport à l' autre. Et comme maintenant tous les gros ordinateurs travaillent en multitasking, la comparaison est quasiment impossible.

    L'élimination systématique des 'goto' est une habitude à prendre: on cherche un petit peu au début, et une fois l'habitude prise, on ne peut plus revenir en arrière, et quand on tombe sur des bouzins à goto.... on attrappe mal à la tête et des boutons.
    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  11. #8
    kikouté

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    bonsoir.
    en reponse pour Konrad,

    une precision

    GOTO ,on appel cela en informatique un "saut inconditionnel" , effectivement on part dans un programme n'importe ou , et apres pour revenir c'est un autre GOTO ? dailleurs Abracadabra75 l'explique tres bien.
    les boucles n'ont rien a voir avec un GOTO.
    En général un débutant utilise un GOTO pour aller dans un endoit d'un programme (et.ou) pour en revenir.

    Mauvais procédé, a banir.

    Quand on crée un programme pour qu'il soit lisible et comprehensible , il est fabriqué avec plusieurs voir de nombreux sou-programmes, le tout en relation avec un programme Maitre, qui lui son role est d'envoyer les differentes executions à ces sous-prog.
    Donc on utilise " GOSUB" qui lui envoie au sous programme desiré , une fois dans le sous prog. l'operation effectuée terminée on revient par "RETURN" au prog.Maitre

    Je n'invente rien cela s'appelle un programme structuré.

    Un exemple.

    -rem prog pricipal
    DO
    IF X=Y THEN GOSUB PROG2
    IF X=Z THEN GOSUB PROG3
    LOOP
    -rem sous programmes
    PROCEDURE PROG2:
    X+ X+1
    RETURN

    PROCEDURE PROG3
    X=X+2
    RETURN

    Bon c'est juste un modeste exemple pour te montrer le principe, ici j'utilise un ancien programme GFA BASIC de ATARI .
    Cela est neanmoins valable pour d'autres langages, c'est le principe qu'il faut retenir.
    Si je programme un uC PIC ou ATMEL le principe reste le meme.
    Il faut s'imposer un structure , dailleurs un programme c'est comme tout, cela se prepare d'abord sur du papier, ensuite au clavier, un organigramme meme le plus simple aide.

    a bientot

  12. #9
    plath

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par domlefebvre Voir le message
    Bonsoir,

    Juste pour corriger une grosse erreur : FORTRAN 77 comporte les boucles do while et do enddo dans sa syntaxe....
    Voir par exemple www.tangenteX.com pour une initiation à la physique numérique en FORTRAN 77
    Bonjour,

    Mea culpa j'ai parlé trop vite...
    Ceci dit merci beaucoup pour le lien très intéresant!
    PLATH

  13. #10
    domlefebvre

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par abracadabra75 Voir le message
    L'élimination systématique des 'goto' est une habitude à prendre: on cherche un petit peu au début, et une fois l'habitude prise, on ne peut plus revenir en arrière, et quand on tombe sur des bouzins à goto.... on attrappe mal à la tête et des boutons.
    A+

    Bonjour,

    Comme tous les intégrismes, cette tendance à bannir l'usage du GOTO est dommageable!
    Le GOTO est une instruction à manier avec précaution et dans des cas très particuliers.

    Il devrait être interdit de l'utiliser pour simuler des boucles, sauf impossibilité due au langage. N'oublions tout de même pas que la traduction assembleur (et a fortiori en langage machine) de nos magnifiques boucles sont des "jump", forme primaire du GOTO.

    Il reste que le GOTO (et ses succédanés un peu plus évolués dans certains langages) est indispensable dans le traitement des erreurs. Il est peu pratique (et inutile) d'écrire un handler d'exception sans GOTO. En c et c++, on dispose d'instructions particulières pour cela. Pas en FORTRAN 77 (ni même 90). Et donc, on est susceptible de trouver des GOTO justifiés dans les handlers d'exception.

    JF Colonna (du X-CMAP) a écris un beau papier là dessus il y a qq années, qui doit toujours être disponible sur enseignement.polytechnique.fr

  14. #11
    fderwelt

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par domlefebvre Voir le message
    Comme tous les intégrismes, cette tendance à bannir l'usage du GOTO est dommageable!
    Le GOTO est une instruction à manier avec précaution et dans des cas très particuliers.
    Bonjour,

    En fait le problème ce n'est pas tant le GO TO que les étiquettes d'instructions (labels). On ne peut pas (du moins pas sans précaution) savoir d'où provient un branchement à un label donné. Quelqu'un avait suggéré qu'on pourrait y remédier en remplaçant le GO TO par une instruction COME FROM, beaucoup plus claire d'après lui...

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  15. #12
    domlefebvre

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Bonjour,
    C'est très juste. Mais là, on touche plus au problème de la structuration du code. Tu sais, j'ai vu des programmeurs (!?) écrirent des vrais plats de nouilles sans GOTO! Ils se débrouillent parfaitement pour faire n'importe quoi avec des DO WHILE ou de REPEAT UNTIL (dont ils ne maîtrisent pas la différence!) ...
    J'ai vu aussi des gens faire des programmes très propres avec des jump en assembleur ou des GOTO en FORTRAN.
    Je crois que c'est plus une affaire d'expérience et de compétence. Il est vrai en tous les cas qu'il faut dire aux programmeurs débutants d'éviter les GOTO. Il faut aussi leur enseigner à écrire des pseudo-codes ou même des organigrammes avant de ce jeter sur leur clavier sans avoir réfléchi un seul instant à leur algo...

  16. Publicité
  17. #13
    fderwelt

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Re,

    Tiré du "Manifeste des Véritables Programmeurs":

    Malgré la mode des langages tels que Pascal, un Véritable Programmeur saura toujours coder du FORTRAN en n'importe quel langage."

    Sans commentaires (bin oui, c'est du fortran, on gicle les cartes C-en-colonne-1).

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  18. #14
    domlefebvre

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par fderwelt Voir le message
    Re,

    Tiré du "Manifeste des Véritables Programmeurs":

    Malgré la mode des langages tels que Pascal, un Véritable Programmeur saura toujours coder du FORTRAN en n'importe quel langage."

    Sans commentaires (bin oui, c'est du fortran, on gicle les cartes C-en-colonne-1).

    -- françois

    J'ADORE le FORTRAN! Je ne connais rien de plus naturel pour passer de mes équations à mon code

  19. #15
    azad

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation
    N'oublions tout de même pas que la traduction assembleur (et a fortiori en langage machine) de nos magnifiques boucles sont des "jump", forme primaire du GOTO.
    Bonsoir.
    Pas tout à fait d' accord, mais peut être que je pinaille : dans la boucle il n'y a pas de GOTO mais un branchement aprés comparaison. Ce qui reste dans la logique du "structuré"

  20. #16
    domlefebvre

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par azad Voir le message
    Citation
    N'oublions tout de même pas que la traduction assembleur (et a fortiori en langage machine) de nos magnifiques boucles sont des "jump", forme primaire du GOTO.
    Bonsoir.
    Pas tout à fait d' accord, mais peut être que je pinaille : dans la boucle il n'y a pas de GOTO mais un branchement aprés comparaison. Ce qui reste dans la logique du "structuré"
    Bonjour,

    Pinaillons alors... Dans la traduction en assembleur (ASM) d'une boucle DO WHILE par exemple, tu as effectivement:
    une comparaison (un IF pour parler FORTRAN)
    deux branchements inconditionnels (des GOTO pour parler FORTRAN) en fonction du résultat de la comparaison. En ASM, il y a même deux comparaisons (à cause de sa grammaire).

    Ceci dit, la logique de programmation strcuturée n'a rien à voir avec le langage ou l'usage de GOTO. Tu peux écrire un programme structuré en ASM avec des jump. ET c'est heureux pour ceux qui codent encore en ASM (il y en a...).
    La programmation structurée est histoire de logique et d'architecture de logiciel, pas de langage. Bien que je t'accorde que faire du "structuré" est plus facile en pascal qu'en ASM.

  21. #17
    abracadabra75

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par domlefebvre Voir le message
    J'ai vu aussi des gens faire des programmes très propres avec des jump en assembleur ou des GOTO en FORTRAN.
    Je crois que c'est plus une affaire d'expérience et de compétence. Il est vrai en tous les cas qu'il faut dire aux programmeurs débutants d'éviter les GOTO. Il faut aussi leur enseigner à écrire des pseudo-codes ou même des organigrammes avant de ce jeter sur leur clavier sans avoir réfléchi un seul instant à leur algo...
    Avec un peu de retard je reviens sur le sujet(j'étais en déplacement).
    Je partage tout à fait tes remarques: il ne s'agit surtout pas d'être intégriste, qui est une.....bêtise innommable. La programmation structurée (et je répète: quelque soit le langage) apporte rigueur d'écriture, facilité de compréhension, et maintenance plus facile. Par contre, la lecture du code nécessite d'incessants aller et retour entre le corps principal du programme et les sous-programmes. L'emploi d'un GOTO ponctuel, sans branchements' sauvages' permet d'alléger l'écriture; mais cela demande de la rigueur; et quand ultérieurement une autre personne (ou toi-même quand tu auras oublié les détails de ton prog.) le reprendra, le fait de trouver des GOTO te fera sûrement poser la question des branchements sauvages.
    Vouloir coder sans algorithme préalable ne peut pas aboutir à quelque chose de bon.
    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  22. #18
    danyvio

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Pour avoir programmé pendant de TRèS nombreuses années dans différents langages, dont le COBOL, je confirme que l'emploi du GO TO devrait être réservé à des séquence de programmation très spécifiques. Par exemple, dans les séquences de contrôle des données entrées dans un système, où les données doivent être contrôlées intrinsèquement, mais aussi conformes aux autres données (contrôles de cohérence). Dans ces contextes, les conditions exprimées en logique formelle deviennent si complexes qu'un bon GOTO est souvent préférable pour séparer des séquences de contrôle.
    Dans tous les autres cas, et je reviens au COBOL moderne avec ses commandes WHILE, PERFORM .. UNTIL etc. un programme peut être structuré sans GO TO. Il y gagne en clarté, et oblige le programmeur à se creuser un peu le citron, pour le plus grand bien de la maintenance ultérieure.
    On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !

  23. Publicité
  24. #19
    abracadabra75

    Re : Boucle ou GOTO : lequel est le plus rapide ?

    Citation Envoyé par domlefebvre Voir le message
    Bonjour,

    Pinaillons alors... Dans la traduction en assembleur (ASM) d'une boucle DO WHILE par exemple, tu as effectivement:

    ......etc
    C'est justement ce qu'il ne faut pas faire:
    1) tu es en langage de haut niveau, donc il ne faut faut pas se soucier du langage intermédiaire, ou alors pourquoi ne pas aller jusqu' au binaire.
    2)il est évident qu'une instruction de langage de haut niveau va se traduire par une multitude d'instruction ASM (restons à ce niveau), dont des sauts (jump ou goto, peu importe leur nom) pour certaines (comparaisons). Mais comme cette instruction complexe dans sa traduction reste claire dans le langage utilisé, peu importe ce qui se passe en réalité aux niveaux inférieurs.
    Les langages de haut niveau ont été inventés pour simplifier la vie (l'écriture). Mais on ne pourra jamais empêcher un esprit tordu de programmer de façon tordue.
    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

Discussions similaires

  1. lequel est le mieux
    Par le debutant05 dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 19
    Dernier message: 08/11/2009, 11h45
  2. Correction exo sur molalité LEQUEL EST JUSTE??
    Par sandrine1609 dans le forum Chimie
    Réponses: 4
    Dernier message: 12/11/2006, 10h32
  3. lequel de ces deux portable est le mieux?
    Par luminou85 dans le forum Matériel - Hardware
    Réponses: 10
    Dernier message: 02/10/2006, 21h24
  4. Oh regarde un satellite, c est lequel?
    Par gaet dans le forum Astronautique
    Réponses: 9
    Dernier message: 17/07/2005, 06h51
Découvrez nos comparatifs produits sur l'informatique et les technologies.