Forum Liberty Basic France

Général » Optimisation du code comment gagner en performance
Le 27/05/2020 à 18h53

Modérateur

Groupe: Modérateur

Inscrit le: 30/03/2011
Messages: 430
Bonjour bonjour,

Ici je voudrais mettre à jour l'écriture horizontale que je trouve plutot inexistante dans les codes que je trouve sur le net. Pourtant, les gains brutes en performance sont entre 10-20% pour les même calculs .... d'ou ma question : Pourquoi écrit-on en vertical ?

Voici un exemple d'écriture verticale (non optimisé donc) puis d'écriture horizontale (allant jusqu'à 20% plus vite) ce sont des exemple... ne faite pas copier coller en espérant que ca marche XD


code vertical :

print #test, "place 100 50"; "ceci est un test numéro "; test
print #test, "place 40 100"; "tout est ok dans ce test"
test = test + 1
dataTEST = 5425
print #test, "place 200 200"; "fin du test"

code horizontal :

print #test, "place 100 50"; "ceci est un test numéro "; test : print #test, "place 40 100"; "tout est ok dans ce test" : test = test + 1 : dataTEST = 5425 : print #test, "place 200 200"; "fin du test"
____________________
Yo !

MSN Web    
Le 27/05/2020 à 19h15

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
slt,

une première chose importante à prendre en compte c'est que :

- on n'a pas toujours besoin de vitesse.
Dans ces cas là, je pense qu'il est bien d'aéré et de rendre son code lisible pour la maintenance ultérieur.

... pour l'autre cas où, c'est effetcivement important, je préfère laissé les VRAIS informaticiens/programmeurs répondre :p



Edité par joan74 Le 27/05/2020 à 19h15
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 27/05/2020 à 19h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2480
Pour tester, il faut mettre un: "ta =time$("milliseconds")" en début de test
Un: "tb=time$("milliseconds")" à la fin
Et faire t=tb-ta
faire les deux tests (avec des instructions identiques) et afficher les temps dans des textbox.
Et là, on te croira.
Code VB :
 
 NOMAINWIN
    WindowWidth = 600: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTBOX  #w.tun, 20 , 50, 100, 25
    TEXTBOX  #w.tdeux, 150 , 50, 100, 25
    BUTTON #w.go, "Go !", [goa], UL, 50, 80, 40, 20
    BUTTON #w.go, "Go !", [gob], UL, 180, 80, 40, 20
    GRAPHICBOX #w.m 5, 5, 585, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
   ' #w.m, "when leftButtonDown [scanne]"
    #w.m  "down;fill darkred"
    #w.m, "when leftButtonMove [scanne]"
    wait
 [goa]
   ta =time$("milliseconds")
   #w.m, "down"
   #w.m, "fill darkpink"
   #w.m, "color white"
   #w.m, "backcolor darkpink"
   #w.m, "font courrier 12 bold"
   #w.m, "place 20 120"
   #w.m, "\test A"
   tb=time$("milliseconds")
   tun=tb-ta
   #w.tun, str$(tun)
 wait
  [gob]
   tc =time$("milliseconds")
   #w.m, "down;fill darkpink;color white;backcolor darkpink;font courrier 12 bold"
   #w.m, "place 180 120":  #w.m, "\test B"
   td=time$("milliseconds")
   tdeux=td-tc
   #w.tdeux, str$(tdeux)
   wait
  [closeHelp]
    CLOSE  #w
    END
 
____________________
Roro

   
Le 27/05/2020 à 20h14

Modérateur

Groupe: Modérateur

Inscrit le: 30/03/2011
Messages: 430
je lai fait, avec le test des if et des "case" =)

il suffit de remplacer les if en bas par des if developper et tu pourras constater la différence. En horizontal on est a 317-322 ms max, en developper (vertical) on est a 359-367ms


Code VB :
dim MoveE(100)
 
'on choisit les valeurs pour le simili MoveE+n° d'ordre
numtest=2
select case numtest
    case 1 : test$="0 56 22 0 1 69" 'équivalent de MoveE1 à MoveE6
    case 2 : test$="1 0 28 1 65 80"
    case 3 : test$="0 1 45 3 5 0"
end select
print "chaine retenue : ";test$
 
'à l'intérieur de la chaîne, on compte le nombre de séparateurs de données
sep=0
for a=1 to len(test$)
    if mid$(test$,a,1)=" " then sep=sep+1
next
 
'auquel on ajoute 1 pour avoir le nombre de données
nb=sep+1
 
'et on remplit MoveE() avec ces données
for a=0 to nb-1
    MoveE(a)=val(word$(test$,a))
next
 
'chaque élément de Move() est relié à un deux sprites ayant mêmes coordonnées
'un sprite qui s'affiche lorsque l'élément de move vaut 0, un autre qui s'affiche losque lélément est > 0
'il faut autant de sprites que d'éléments de MoveE()
possprite$="20 40 20 60 89 24 557 63 212 489 652 321"
dim sprxy(nb*2,2)
for a=0 to nb-1
    sprxy(a,0)=val(word$(possprite$,a*2+1))
    sprxy(a,1)=val(word$(possprite$,a*2+2))
    print "MoveE(";a;"), équivalent à MoveE";a;" original, coordonnées sprite x=";sprxy(a,0);", y=";sprxy(a,1)
next
 
'***** début chronométrage 1******
tours=10000
topdepart1=time$("ms")
for boucles=1 to tours
    'pour chacune des données de MoveE(), on regarde quel traitement s'applique
    for a=0 to nb-1
 
        'numéro du sprite : 1 pour move0, 11 pour move1,  109 pour move 10
        if a=0 then nbsprite=1
        if a>0 and a<10 then nbsprite=a+10
        if a>9 then nbsprite=a+100
 
        'juste pour ne pas répéter 36 fois la meme instruction...
        nsp$=str$(nbsprite)
        nomE$="E"+nsp$
        nomD$="ED"+nsp$
        spx=sprxy(a,0)
        spy=sprxy(a,1)
 
        if MoveE(a)>0 then chaine1$="spritexy ";nomE$;" ";spx;" ";spy : chaine2$="SpriteVisible ";nomE$;" on" : chaine3$="cyclesprite ";nomE$;" 1" : chaine4$="spritevisible ";nomD$;" off" : chaine5$="spritetofront ";nomE$;" "
        if MoveE(a)=0 then chaine1$="spritexy ";nomD$;" ";spx;" ";spy+10 : chaine2$="SpriteVisible ";nomD$;" on" : chaine4$="spritevisible ";nomE$;" off"
 
    next
 
next boucles
 
'***** fin chronométrage 1 *****
topfin1=time$("ms")
 
'****** préparation prochain bloc à tester
MoveE1=MoveE(0)
MoveE2=MoveE(1)
MoveE3=MoveE(2)
MoveE4=MoveE(3)
MoveE5=MoveE(4)
MoveE6=MoveE(5)
 
'******* début chronométrage 2
topdepart2=time$("ms")
for boucles=1 to tours
 
    if MoveE1 > 0 then chaine1$="spritexy E1 ";E1x;" ";E1y : chaine2$="SpriteVisible E1 on" : chaine3$="cyclesprite E1 1" : chaine4$="SpriteVisible ED1 off" : chaine5$="spritetofront E1"
    if MoveE1 = 0 then chaine1$="spritexy ED1 ";E1x;" ";E1y+10 : chaine2$="SpriteVisible ED1 on" : chaine3$="SpriteVisible E1 off"
    if MoveE2 > 0 then chaine1$="spritexy E11 ";E11x;" ";E11y : chaine2$="SpriteVisible E11 on" : chaine3$= "cyclesprite E11 1" : chaine4$="SpriteVisible ED11 off" : chaine5$="spritetofront E11"
    if MoveE2 = 0 then chaine1$="spritexy ED11 ";E11x;" ";E11y+10 : chaine2$="SpriteVisible ED11 on" : chaine3$="SpriteVisible E11 off"
    if MoveE3 > 0 then chaine1$="spritexy E12 ";E12x;" ";E12y : chaine2$="SpriteVisible E12 on" : chaine3$= "cyclesprite E12 1" : chaine4$="SpriteVisible ED12 off" : chaine5$="spritetofront E12"
    if MoveE3 = 0 then chaine1$="spritexy ED12 ";E12x;" ";E12y+10 : chaine2$="SpriteVisible ED12 on" : chaine3$="SpriteVisible E12 off"
    if MoveE4 > 0 then chaine1$="spritexy E13 ";E13x;" ";E13y : chaine2$="SpriteVisible E13 on" : chaine3$= "cyclesprite E13 1" : chaine4$="SpriteVisible ED13 off" : chaine5$="spritetofront E13"
    if MoveE4 = 0 then chaine1$="spritexy ED13 ";E13x;" ";E13y+10 : chaine2$="SpriteVisible ED13 on" : chaine3$="SpriteVisible E13 off"
    if MoveE5 > 0 then chaine1$="spritexy E14 ";E14x;" ";E14y : chaine2$="SpriteVisible E14 on" : chaine3$= "cyclesprite E14 1" : chaine4$="SpriteVisible ED14 off" : chaine5$="spritetofront E14"
    if MoveE5 = 0 then chaine1$="spritexy ED14 ";E14x;" ";E14y+10 : chaine2$="SpriteVisible ED14 on" : chaine3$="SpriteVisible E14 off"
    if MoveE6 > 0 then chaine1$="spritexy E15 ";E15x;" ";E15y : chaine2$="SpriteVisible E15 on" :  chaine3$= "cyclesprite E15 1" : chaine4$="SpriteVisible ED15 off" : chaine5$="spritetofront E15"
    if MoveE6 = 0 then chaine1$="spritexy ED15 ";E15x;" ";E15y+10 : chaine2$="SpriteVisible ED15 on" : chaine3$="SpriteVisible E15 off"
 
next boucles
 
'***** fin chronométrage 2 *****

'***** résultats des chronométrages *******
topfin2=time$("ms")
print
print "pour ";tours;" fois les blocs d'instructions, l'ordi a mis : "
print "  ";topfin1-topdepart1;" ms pour la solution à base de boucles"
print "  ";topfin2-topdepart2;" ms pour la solution à base d'ifs"
 
end
 
 




Edité par atomose Le 27/05/2020 à 20h33
____________________
Yo !

MSN Web    
Le 28/05/2020 à 09h35

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2480
A mon avis tu compare deux procédures et non deux écritures différentes
Ou je ne comprends pas tes concepts de verticale/horizontale.
____________________
Roro

   
Le 28/05/2020 à 10h56

Modérateur

Groupe: Modérateur

Inscrit le: 30/03/2011
Messages: 430
nn dans un premier test je fait avec l'ecriture horizontal
dans un second test je retire la partie des if qui est horizontal et je la remplace par un developpement vertical. Après je compare les deux résultat. je ne tiens pas compte de la solution a base de boucles ce qui m'interesse c juste le chrono pour les if.
____________________
Yo !

MSN Web    
Le 28/05/2020 à 16h03

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2480
Intègre les deux blocs de code que tu compare dans le mien; un bloc entre : ta ...tb et l'autre bloc entre: tc...td
ça sera plus clair.
____________________
Roro

   
Général » Optimisation du code comment gagner en performance  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie