Optimisation des boucles FOR

11 sujets de 1 à 11 (sur un total de 11)

  • Anonyme

      #9216

      Hello,

      Comment optimiser les boucles ou les rendre 2 fois plus rapide?

      Simple,

      essayer se code et noter le chiffre qui apparait :

      @SCREEN {Width = 640, Height = 480}

      Function PRG()

      StartTimer(1)

      For I=0 To 100000

      Local A=I

      Next

      Local Temps=GetTimer(1)

      TextOut (0,0,Temps)

      Cls

      EndFunction

      SetInterval(1,PRG,20)

      Repeat

      WaitEvent()

      Forever

      Maintenant, indiquer à la boucle que la variable I est local:

      @SCREEN {Width = 640, Height = 480}

      Function PRG()

      StartTimer(1)

      For Local I=0 To 100000

      Local A=I

      Next

      Local Temps=GetTimer(1)

      TextOut (0,0,Temps)

      Cls

      EndFunction

      SetInterval(1,PRG,20)

      Repeat

      WaitEvent()

      Forever

      Que remarquez-vous? Oui, vous avez bien lu le chiffre…

      Le temps est divisé par 2

      Pour optimiser vos boucles, n’hésiter pas à indiquer que la variable qui défini la boucle est locale ;-)

      Respect

      Foul

        #141370

        on peut implémenter ca sur une femme ?

        Pour lui dire de la boucler 2x plus vite ?

        :-D

        Anonyme

          #141371

          Sa dépend avec qu’elle câble elle est branché pour lui filer le code…

          Et avec quelle ordinateur tu va taper dessus.

          Je te conseil un serveur ou plutôt le IMac, car le Imac à l’écran(donc plus lourd), et quand tu tape avec un Imac… sa fais vraiment mal ;-)

          serge

            #141372

            Eh les gars, si vous avez besoin de faire taire vos femmes c’est que vous ne vous y prenez pas bien :-)

            Moi la mienne, plus je l’entends et plus j’aime ca. Faut juste savoir s’arranger pour entendre ce qui nous plait le plus :-D

            /me aime bien écouter french kiss

            RyZen Rulez 😉

            Tarzin

              #141373

              Super intéressant ça Artblink!

              Une simple variable déclarée en local qi fait gagner autant de temps.

              Remarque que dans la doc, Andreas insiste fortement sur la fait d’utiliser les variables locales, fallait juste confirmer ce fait.

              Anonyme

                #141374

                T’as vu le gain de vitesse sur les boucles… imagine que l’on peut gagner encore 20% si on arrive a déclarer Next comme fonction local ;-)

                Par contre andreas n’indique malheureusement pas que les variables de boucles doivent être déclaré localement…

                C’est un message a faire passé à tous les dév hollywood ;-)

                Le petit PRG que j’ai donné est sympa pour faire plein de test de construction de programme… tu verra qu’il vau mieux utilisé une variable qui contient un calcul long que plusieurs variable pour 1 calcule ex:

                For I=0 to 1000

                Local A=sin(I)*Cos(I)

                next

                est plus rapide que

                For I=0 to 1000

                Local A=sin(I)

                Local B=cos(I)

                Local C=A*B

                Next

                le gain: 12.5% en vitesse

                je suis 70 tick sur le premier et 80 ticks sur le second ;-)

                Autre chose en se qui concerne les fonctions… Un truc que je m’étais douté.

                Les appels de fonction ralentissent considérablement le programme. si je code ceci:

                @SCREEN {Width = 640, Height = 480}

                Function test()

                If A<1000 Then A=I

                Local A=Cos(I)*Sin(i)

                EndFunction

                Function PRG()

                StartTimer(1)

                For Local I=0 To 100000

                test

                Next

                Local Temps=GetTimer(1)

                TextOut (0,0,Temps)

                Cls

                EndFunction

                SetInterval(1,PRG,20)

                Repeat

                WaitEvent()

                Forever

                J’obtiens 115 ticks!!!!!

                Alors que si je code comme sa:

                @SCREEN {Width = 640, Height = 480}

                Function PRG()

                StartTimer(1)

                For Local I=0 To 100000

                If A<1000 Then A=I

                Local A=Cos(I)*Sin(i)

                Next

                Local Temps=GetTimer(1)

                TextOut (0,0,Temps)

                Cls

                EndFunction

                SetInterval(1,PRG,20)

                Repeat

                WaitEvent()

                Forever

                J’obtiens 70 ticks

                L’appel d’une fonction dans se cas, donne une perte de 39%!!!!

                même une fonction local ne fait gagner que très peux de temps.

                Evite donc l’appel de fonction, c’est un Pb qui existe aussi sous LUA.

                serge

                  #141375

                  moi, j’adore les boucles, surtout blondes, mais ce que j’apprécie le plus, c’est de voir un sujet en programmation sur IA qui m’apprend des choses.

                  Merci Artblink

                  RyZen Rulez 😉

                  Tarzin

                    #141376

                    C’est là qu’on retrouve le plaisir de programmer proprement, en réfléchissant et en utilisant au maximum les capacités de la machine. (moi, c’est encore pire, je programme pour un 68k émulé)

                    Je pense faire un truc avec Artblink sur mon site répertoriant toutes ces petites astuces pour Hollywood. Ca pourra servir aux utilisateurs futurs et actuels. ;-)

                    Anonyme

                      #141377

                      @Serge: de rien… il faut s’entraider et faire apprécier la programmation, plus on sera, mieux se sera. Je file toute mes combines pour aider au max les petits programmeurs comme moi ;-)


                      @Tarzin
                      :

                      J’ai modifié le PRG de Jali, le moteur en surface pleine tourne à 500 FPS au lieu des max(130FPS)… hihihi, je te file la routine quand je l’aurai affiné.

                      Au lieu de divisé tes valeurs par 2, utilise >>1 (décalage de 1 bit vers la droite) sa fais la même chose, comme multiplié par 2, utilise <<1. Je teste la vitesse de tous sa pour te confirmer se que me dise les développeurs LUA ;-)

                      J’ai vérifier les décalage binaires…hum, c’est pareil que / et *… pas de gain, dommage

                      Tarzin

                        #141378

                        Au lieu de divisé tes valeurs par 2, utilise >>1 (décalage de 1 bit vers la droite) sa fais la même chose, comme multiplié par 2, utilise <<1. Je teste la vitesse de tous sa pour te confirmer se que me dise les développeurs LUA

                        C’est bon aussi à prendre

                        Ce qui serait bien c’est de faire un truc du genre:

                        a=a+1 -> autant de temps

                        a=add(a,1) -> autant de temps

                        local a=a+1 -> autant de temps

                        local a=add(a,1) -> autant de temps

                        etc…

                        Ca permettrait de voir quelles sont les commandes à retenir ou à utiliser.

                        Anonyme

                          #141379

                          C’est se que je suis en train de faire… ;-)

                          Les grands esprit se rencontre.

                          Par contre mes tests seront effectué sur la version Win et microAone d’hollywood, je prépare sa.

                          Attention, car je pense que selon les OS et les machines, les résultats peuvent être différent, exemple, un décalage binaire sur PC sera peut être plus lent qu’un décalage binaire sur AOS, en gros, tu sors un PRG, sous AOS, il faudra peut être utiliser « x=x*2 » pour une multiplication et sous morphos « x=mul(x,2) » et sous win « x =x << 1". Après, il faudrais un tableau pour morphos/Aos/Warpup/6800x0. Mais moi je peux faire que win (mais bon sa intéresse pas grand monde ;-) ) et AOS. Faut trouver des gens qui ont holly et morphos, un autre qui à holly et 680×0 et un autre avec holly Warpup ou je fais un exécutable, une sorte de benchmark des commandes mathématique, accès mémoire et tables (spécialités LUA) voir les chaines et autre.

                          Mais un benchmarks va me prendre du temp (et pu le temp pour mon moteur raycast… snif)

                          Je me débrouille, et je te dis koi ;-)

                        11 sujets de 1 à 11 (sur un total de 11)

                        • Vous devez être connecté pour répondre à ce sujet.

                        Forums AmigaOS, MorphOS et AROS Développement Optimisation des boucles FOR

                        Amiga Impact