Optimisation des boucles FOR
11 sujets de 1 à 11 (sur un total de 11)
-
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
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
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
/me aime bien écouter french kiss
RyZen Rulez 😉
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.
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.
@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
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
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.
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