Accueil > Forum > > > > Optimiser 4 "if" dansune boucle
Optimiser 4 "if" dansune boucle
lundi 6 février 2006 à 00:09:39 |
Optimiser 4 "if" dansune boucle

kakenette
|
Bonjour, voila jaurai voulu savoire si c pas possible d'optimiser ce code pour reduire le nombre de "if" ? je suis sur que sa doit etre possible lol, jai essaye une autre boucle dans la boucle mais sa change rien etant donner quil va faire 4 fois la boucle et donc 4 fois le test "if"... Bon je suis consciente que je viens pas ici pour me faire servire sur un plateau le nouveau code ! sa minteresserai de voire les possibilitées ou si il ya dautre moyen de pouvoire optimiser ca : For T = 1 To 50 Rem Haut ( = 1 ) If JMove(T) = 1 Then Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T) If Joueur(T).Top <= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T) End If Rem Bas ( = 2 ) If JMove(T) = 2 Then Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T) If Joueur(T).Top >= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T) End If Rem Gauche ( = 3 ) If JMove(T) = 3 Then Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T) If Joueur(T).Left <= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T) End If Rem Droite ( = 4 ) If JMove(T) = 4 Then Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T) If Joueur(T).Left >= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T) End If Next T Merci! kakenette
|
|
lundi 6 février 2006 à 00:33:47 |
Re : Optimiser 4 "if" dansune boucle

Galain
|
Salut kakenette Essaie ceci et dis-moi si cela te convient For T = 1 To 50 Select case JMove(T) case 1 ' Haut Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T) If Joueur(T).Top <= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T) case 2 ' Bas Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T) If Joueur(T).Top >= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T) case 3 ' Gauche Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T) If Joueur(T).Left <= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T) case 4 ' Droite Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T) If Joueur(T).Left >= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T) End Select Next T GRENIER Alain 
|
|
lundi 6 février 2006 à 00:50:30 |
Re : Optimiser 4 "if" dansune boucle

kakenette
|
c se que javais pensée faire mais on ma dit que sa va pas changer le problem car les case il va les faire 1 par 1 comme meme
kakenette
|
|
lundi 6 février 2006 à 01:08:08 |
Re : Optimiser 4 "if" dansune boucle

Galain
|
Salut Kakenette Avec les 4 If le programme va les tester un par un jusqu'à trouver le bon bloc à traiter Avec select case le programme va directement au bon bloc à traiter ans les tester un par un Dans le second cas tu gagnes du temps GRENIER Alain 
|
|
lundi 6 février 2006 à 01:09:42 |
Re : Optimiser 4 "if" dansune boucle

Galain
|
Salut Kakenette Faute de frappe : sans les tester un par un Avec les 4 If le programme va les tester un par un jusqu'à trouver le bon bloc à traiter Avec select case le programme va directement au bon bloc à traiter sans les tester un par un Dans le second cas tu gagnes du temps GRENIER Alain 
|
|
lundi 6 février 2006 à 01:26:18 |
Re : Optimiser 4 "if" dansune boucle

kakenette
|
na jai un amis "BurNews" il dit que sa les test un par un car il dit que le compilateur n'est pas devaint enfin voila en attendant jutilise ta solution, celle que je voulais faire.
mais je suis sur que je peut enlever le select case et les if en treiton direcement la valeur de JMove(T)
kakenette
|
|
lundi 6 février 2006 à 01:38:41 |
Re : Optimiser 4 "if" dansune boucle

Galain
|
Brunews a raison : dans les 2 cas on les teste un par un et je reconnais m'être trompé Désolé GRENIER Alain 
|
|
lundi 6 février 2006 à 01:42:09 |
Re : Optimiser 4 "if" dansune boucle
|
lundi 6 février 2006 à 02:00:21 |
Re : Optimiser 4 "if" dansune boucle

Gobillot
|
Salut, ça les teste un par un jusqu'au moment où il trouve c'est à dire que pour le cas 1 les autres cas sont pas traités, pour le cas 2 on gagne le test 3 et 4, etc... tout ceci pouvant être remplacé par des ElseIf. pour utiliser JMove(T) il faudrait l'utiliser en tant qu'opérateur Top et Left JMove(1) --> -1 et 0 JMove(2) --> +1 et 0 JMove(1) --> 0 et -1 JMove(2) --> 0 et +1 traiter Left et Top en même temps, mais ça n'empêchera pas les autres tests qui sont différents à chaque fois donc gain de temps ??? NB: ce qui semble bizarre c'est qu'il n'y a pas de valeurs mini et maxi pour JTop et JLeft If Joueur(T).Top <= JTopMin(T) Then ... If Joueur(T).Top >= JTopMax(T) Then ... Daniel
|
|
lundi 6 février 2006 à 05:38:34 |
Re : Optimiser 4 "if" dansune boucle

Zlub
|
Salut kakenette,
Le cas des ElseIf est pas mal vu qu'on arrete de tester des qu'on trouve un test à True.
If JMove(T) = 1 Then ' Haut ( = 1 ) ElseIf JMove(T) = 2 Then ' Bas ( = 2 ) ElseIf JMove(T) = 3 Then 'Gauche ( = 3 ) Else ' Droite ( = 4 ) End If Mais pas top, je m'explique avec deux cas extremes :
- si JMove(T) = 1 alors on fait 1 test (nickel) - si JMove(T) = 4 alors on aura fait 3 tests (pas top, mais mieux que tes 4)
Tout dépend de la répartition des tes valeurs. Si tu as plus de cas 4 que de cas 1 c'est pas génial.
Tu peux réduire le nombre de test en orientant la recherche de façon dichotomique. En gros, c'est la stratégie visant à diviser pour mieux regner. Je te propose donc de réduire de moitié les tests effectués à chaque tour. L'idée c'est de derterminer :
1) si on est dans le couple (droite,gauche) ou dans le couple (haut,bas) 2) puis afiner pour trouver le bon cas

Const HAUT = 1 Const BAS = 2 Const GAUCHE = 3 Const DROITE = 4
Sub test()
For T = 1 To 50 If JMove(T) < GAUCHE Then If JMove(T) = HAUT Then ' Haut Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T) If Joueur(T).Top <= JTop(T) Then JMove(T) = 0: _ Joueur(T).Top = JTop(T) Else ' Bas Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T) If Joueur(T).Top >= JTop(T) Then JMove(T) = 0: _ Joueur(T).Top = JTop(T)
End If
Else If JMove(T) = GAUCHE Then 'Gauche Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T) If Joueur(T).Left <= JLeft(T) Then JMove(T) = 0: _ Joueur(T).Left = JLeft(T) Else ' Droite Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T) If Joueur(T).Left >= JLeft(T) Then JMove(T) = 0: _ Joueur(T).Left = JLeft(T) End If
End If Next i
End Sub
 Ainsi à chaque tour de boucle, il ne sera fait que deux tests au lieu des quatre que l'on avait tant avec la méthode des If que celle des Select
On passe donc dans le pire des cas de 50 * 4 = 200 tests (If - Select) à 50 * 3 = 150 tests (ElseIf) à 50 * 2 = 100 tests En stockant dans une variable en début de boucle, le contenu de JMove(T) et en utilisant cette variable dans les tests, c'est possibles que tu gagnes un peux de temps. NB: tu devrais utiliser des constantes pour aider à la lisibilitée de ton code et également à la maintenance. Ecrire en dur dans le code des valeurs, c'est souvent pas une bonne idées. A toi de selectionner le code qui convient en fonction de la répartition de tes données dans le tableau.
Bon dev,
++
Zlub
|
|
Cette discussion est classée dans : boucle, left, joueur, top, jmove
Répondre à ce message
Sujets en rapport avec ce message
!!!KeyCode!!! [ par luke44 ]
bon, je veut que ImgQc se bouge sur la form (en haut lorsque la fleche vers le haut est enfoncée, en bas lorsque c'est la flèche du bas, à gauche pour
A l'aide, please, je deviens fou... !!! :) [ par echo200 ]
Bonjour,J'ai un petit problème "d'apparition de fenètres"...En plus clair :Sur un projet de popup, j'ai voulu ajoutter un splash screen afin de laisse
Créer des OptionButtons dynamiquement : AIDEZ MOI SVP [ par mayerp ]
Bonjour,Voilà, j'aimerai créer dynamiquement une frame contenant 2 optionbuttons.J'arrive à créer les frames, mais les boutons d'option n'apparaissent
utiliser VERSION 5.00 [ par Yesai ]
Quand j'ecris mon programme sur un fichier txt que je le converti en .frm le programme me dis ke l'entré depasse la fin du fichier:" dans le fichier l
technique de prog pour casse brick [ par bobo91 ]
bonsoir tous le mondeje connais pas la technique pour les coordonnees de la balle par rapport au brick si kelk1 connai une reponse merci d'avance et t
aide 'aspiration' [ par retaks666 ]
Bonjour, je voudrait faire en sorte, a l'aide d'un timer que des objets se dirigent vers le centre de la form puis quand ils soient au mileu reviennen
pb keydown qui ne se déclenche pas [ par acorna ]
hello, j'ai un petit souci concernant le keydown, qui ne se déclenche pas lors de l'appui sur les touches (ds mon cas les flèches directionnelles).
pb n°2 pour fair un pong [ par dOsSpr0uTosS ]
salut à tous,j'ai encor un problèm pour fair un pong deux joueur^^j'ai mon interface qui est fait de deux labels(pour les points)de deux raquettes et
Position de fenêtre VB6 [ par valtrase ]
Lut,J'ai une fenêtre (Form1) avec un labelsi j'ouvre une 2ème fenêtre comment faire pour que son .top et son .left corresponde au .top et .left du lab
creer en dynamique des OptionButton [ par mayerp ]
Bonjour,Les 2 Boutons d'option sont deja sur ma form dans une frame avec tous les deux un index à 0 ( comme tous mes autres controles).Donc je fais bi
Livres en rapport
|
Derniers Blogs
[HTML5] SLIDES ET DéMOS : AUTOUR DU W3C , NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] SLIDES ET DéMOS : AUTOUR DU W3C , NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Très bonne après-midi passée lors cette conférence avec le W3C, organisée par L' Inria sur les nouveaux standards, ce Mardi 14 Février, on sent vraiment que çà bosse au W3C, et l'avenir est très très prometteur pour le HTML5, notamment ...
Cliquez pour lire la suite de l'article par Gio GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc
Forum
RE : VITESSERE : VITESSE par ossama261988
Cliquez pour lire la suite par ossama261988
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|