Compare vitesse d’exécution entre tab en struct et tab(x,y)
Publié : lun. 12/janv./2009 11:37
Bonjour a tous
Le passage par adresse implique que nous n’avons pas de copie des éléments variables
Attention ils sont uniques.
Le premier programme compare la vitesse d’exécution entre un tableau défini en structure et un tableau classique type tab(x,y)
Résultats
Comparaison hors procédure
structure =1141
tableau = 1172
Comparaison en procédure
structure =114O
tableau = 1391
Première remarque les temps sont un peu plus favorables à la table
en structure
deuxième remarque les temps sont identiques en ou hors procédure
pour la table en structure et un peu différents pour la tab(x,y)
Le deuxième programme montre la possibilité de passer plusieurs valeurs en retour de procédure
Le troisième programme reprend tous les principes des deux prg précédents avec des structures plus complexes
Le passage par adresse implique que nous n’avons pas de copie des éléments variables
Attention ils sont uniques.
Le premier programme compare la vitesse d’exécution entre un tableau défini en structure et un tableau classique type tab(x,y)
Code : Tout sélectionner
Macro Quote
"
EndMacro
Macro formn(n)
quote#n# = quote + Str(n)
EndMacro
Macro formc(C)
quote#C# = quote + C
EndMacro
Macro formf(F)
quote#F# = quote + StrF(f)
EndMacro
Macro formd(D)
quote#D# = quote + StrD(D)
EndMacro
Macro formQ(Q)
quote#Q# = quote + StrQ(Q)
EndMacro
Macro formH(H)
quote#H# = quote + Hex(H)
EndMacro
Macro formHq(Hq)
quote#Hq# = quote + HexQ(Hq)
EndMacro
; *********************
Macro debn(n)
Debug quote#n# = quote + Str(n)
EndMacro
Macro debc(C)
Debug quote#C# = quote + C
EndMacro
Macro debf(F)
Debug quote#F# = quote + StrF(f)
EndMacro
Macro debd(D)
Debug quote#D# = quote + StrD(D)
EndMacro
Macro debQ(Q)
Debug quote#Q# = quote + StrQ(Q)
EndMacro
Macro debH(H)
Debug quote#H# = quote + Hex(H)
EndMacro
Macro debHq(Hq)
Debug quote#Hq# = quote + HexQ(Hq)
EndMacro
Procedure.s hex_viewl(*adres.l, long.l)
hext$ = ""
cart$ = ""
For i = 0 To long
num.c = PeekC(*adres + i)
cart$ = cart$ + Chr(num)
hexs.s = Hex(num) + " "
If Len(hexs) = 2
hexs = "0" + hexs
EndIf
hext$ + hexs
Next
ProcedureReturn hext$ + " " + cart$
EndProcedure
Procedure hex_view(*adress, long)
residu.i = long%16
ilong = long/16
For i = 0 To ilong
;Debug Hex(*adress + (i*16))
;Debug hex_viewl (*adress + (i*16), 15)
Debug "$" + Hex(*adress + (i*16)) + " " + hex_viewl(*adress + (i*16), 15)
Next
EndProcedure
; Byte.b 1 octet-128 à + 127
; Caractere.c 1 octet(ascii)0 à + 255
; Caractere.c 2 octets(unicode)0 à + 65535
; Word.w 2 octets-32768 à + 32767
; Long.l 4 octets-2147483648 à + 2147483647
; Integer.i 4 octets(32 bits)-2147483648 à + 2147483647
; Integer.i 8 octets(64 bits)-9223372036854775808 à + 9223372036854775807
; Float.f 4 octets illimité(voir informations plus bas)
; Quad.q 8 octets-9223372036854775808 à + 9223372036854775807
; Double.d 8 octets illimité(voir informations plus bas)
; String.s longueur de la chaine + 1 illimité
; String Fixe.s{Longueur} longueur de la chain
Structure terme
type_terme.c
lng_terme.i
StructureUnion
terme_c.c[16]
terme_b.b[16]
terme_w.w[8]
terme_n.l[4]
terme_i.i[4]
terme_f.f[4]
terme_d.d[2]
terme_q.l[2]
terme_s.s{16}
EndStructureUnion
EndStructure
Structure dim2
D2.l[12]
EndStructure
Structure TAB1
D1.dim2[10]
EndStructure
Define tab.tab1
Dim tabl.l(9, 11)
imax = 1000000
Procedure es_tab(im, *s_tab.tab1, Array tabll.l(2))
t_d_s = ElapsedMilliseconds()
For nb = 0 To im
For l = 0 To 9
For c = 0 To 11
*s_tab\D1[l]\D2[c] = (l*(c + 1)) + c + 2
Next
Next
Next
t_f_s = ElapsedMilliseconds()
t_d_t = ElapsedMilliseconds()
For nb = 0 To im
For l = 0 To 9
For c = 0 To 11
tabll(l, c) = (l*(c + 1)) + c + 1
Next
Next
Next
t_f_t = ElapsedMilliseconds()
; Debug (t_f_s-t_d_s)
; Debug (t_f_t-t_d_t)
R$ = "structure= " + Str(t_f_s-t_d_s) + #CRLF$ + "tableau = " + Str(t_f_t-t_d_t)
MessageRequester("Comparaison en procédure ", R$)
EndProcedure
t_d_s = ElapsedMilliseconds()
For nb = 0 To imax
For l = 0 To 9
For c = 0 To 11
tab\D1[l]\D2[c] = (l*(c + 1)) + c
Next
Next
Next
t_f_s = ElapsedMilliseconds()
;*****************************************
t_d_t = ElapsedMilliseconds()
For nb = 0 To imax
For l = 0 To 9
For c = 0 To 11
tabl(l, c) = (l*(c + 1)) + c
Next
Next
Next
t_f_t = ElapsedMilliseconds()
; Debug (t_f_s-t_d_s)
; Debug (t_f_t-t_d_t)
R$ = "structure= " + Str(t_f_s-t_d_s) + #CRLF$ + "tableau = " + Str(t_f_t-t_d_t)
MessageRequester("Comparaison hors procedure", R$)
es_tab(imax, tab, tabl())
End
Comparaison hors procédure
structure =1141
tableau = 1172
Comparaison en procédure
structure =114O
tableau = 1391
Première remarque les temps sont un peu plus favorables à la table
en structure
deuxième remarque les temps sont identiques en ou hors procédure
pour la table en structure et un peu différents pour la tab(x,y)
Le deuxième programme montre la possibilité de passer plusieurs valeurs en retour de procédure
Code : Tout sélectionner
Macro formQ(Q)
quote#Q# = quote + StrQ(Q)
EndMacro
Macro formH(H)
quote#H# = quote + Hex(H)
EndMacro
Macro formHq(Hq)
quote#Hq# = quote + HexQ(Hq)
EndMacro
; *********************
Macro debn(n)
Debug quote#n# = quote + Str(n)
EndMacro
Macro debc(C)
Debug quote#C# = quote + C
EndMacro
Macro debf(F)
Debug quote#F# = quote + StrF(f)
EndMacro
Macro debd(D)
Debug quote#D# = quote + StrD(D)
EndMacro
Macro debQ(Q)
Debug quote#Q# = quote + StrQ(Q)
EndMacro
Macro debH(H)
Debug quote#H# = quote + Hex(H)
EndMacro
Macro debHq(Hq)
Debug quote#Hq# = quote + HexQ(Hq)
EndMacro
Structure sortie
a.l
b.l
c.l
d.l
EndStructure
Procedure x()
Shared a, b, c, d
a = 29
b = 22
c = 56
d = 35
Static srt.sortie
With srt
\a = a + 2
\b = b + 3
\c = c + 4
\d = d + 5
EndWith
ProcedureReturn @srt
EndProcedure
; *** PRINCIPE ***
*srt.sortie = x()
Debug "**********Voici 4 variables modifiées dans la procédure ********"
Debug formn(a) + " " + formn(b) + " " + formn(c) + " " + formn(d)
Debug "****** sortie multiple => a+2 b+3 c+4 d+5 ****"
Debug formn(*srt\a) + " " + formn(*srt\b) + " " + formn(*srt\c) + " " + formn(*srt\d)
Code : Tout sélectionner
Macro Quote
"
EndMacro
Macro formn(n)
quote#n# = quote + Str(n)
EndMacro
Macro formc(C)
quote#C# = quote + C
EndMacro
Macro formf(F)
quote#F# = quote + StrF(f)
EndMacro
Macro formd(D)
quote#D# = quote + StrD(D)
EndMacro
Macro formQ(Q)
quote#Q# = quote + StrQ(Q)
EndMacro
Macro formH(H)
quote#H# = quote + Hex(H)
EndMacro
Macro formHq(Hq)
quote#Hq# = quote + HexQ(Hq)
EndMacro
; *********************
Macro debn(n)
Debug quote#n# = quote + Str(n)
EndMacro
Macro debc(C)
Debug quote#C# = quote + C
EndMacro
Macro debf(F)
Debug quote#F# = quote + StrF(f)
EndMacro
Macro debd(D)
Debug quote#D# = quote + StrD(D)
EndMacro
Macro debQ(Q)
Debug quote#Q# = quote + StrQ(Q)
EndMacro
Macro debH(H)
Debug quote#H# = quote + Hex(H)
EndMacro
Macro debHq(Hq)
Debug quote#Hq# = quote + HexQ(Hq)
EndMacro
Procedure.s hex_viewl(*adres.l, long.l)
hext$ = ""
cart$ = ""
For i = 0 To long
num.c = PeekC(*adres + i)
cart$ = cart$ + Chr(num)
hexs.s = Hex(num) + " "
If Len(hexs) = 2
hexs = "0" + hexs
EndIf
hext$ + hexs
Next
ProcedureReturn hext$ + " " + cart$
EndProcedure
Procedure hex_view(*adress, long)
residu.i = long%16
ilong = long/16
For i = 0 To ilong
;Debug Hex(*adress + (i*16))
;Debug hex_viewl (*adress + (i*16), 15)
Debug "$" + Hex(*adress + (i*16)) + " " + hex_viewl(*adress + (i*16), 15)
Next
EndProcedure
; Byte.b 1 octet-128 à + 127
; Caractere.c 1 octet(ascii)0 à + 255
; Caractere.c 2 octets(unicode)0 à + 65535
; Word.w 2 octets-32768 à + 32767
; Long.l 4 octets-2147483648 à + 2147483647
; Integer.i 4 octets(32 bits)-2147483648 à + 2147483647
; Integer.i 8 octets(64 bits)-9223372036854775808 à + 9223372036854775807
; Float.f 4 octets illimité(voir informations plus bas)
; Quad.q 8 octets-9223372036854775808 à + 9223372036854775807
; Double.d 8 octets illimité(voir informations plus bas)
; String.s longueur de la chaine + 1 illimité
; String Fixe.s{Longueur} longueur de la chain
Structure terme
type_terme.c
lng_terme.i
StructureUnion
terme_c.c[16]
terme_b.b[16]
terme_w.w[8]
terme_n.l[4]
terme_i.i[4]
terme_f.f[4]
terme_d.d[2]
terme_q.l[2]
terme_s.s{16}
EndStructureUnion
EndStructure
Structure entree
Nb_terme.i
terme_Gen.terme[10]
EndStructure
; Structure sortie
; Type_erreur.l
; rub_erreur.s{25}
; EndStructure
Structure rub
num_rub.l
Nom_rub.s{10}
EndStructure
Structure tab_s
t.rub[4]
nb_elem_t.l
EndStructure
Dim tab2D.rub(5, 12)
NewList listea.tab_s()
Procedure edite(*entr.entree, Array tabl_2D.rub(2), List listex.tab_s())
; Procedure edite(*entr.entree, Array tabl_2D.rub(2))
;Global rtnprc.tab_s
;Shared rtnprc.tab_s
Static rtnprc.tab_s
;Global rtnprc.sortie
; Shared rtnprc.sortie
;Static rtnprc.sortie
Debug "**** Nous sommes dans la procedure ******"
debn(*entr\Nb_terme)
For tt = 0 To 12
If tt<*entr\nb_terme
Debug "**** procedure ****"
debn(tt)
debn(*entr\terme_gen[tt]\type_terme)
debn(*entr\terme_gen[tt]\lng_terme)
debc(*entr\terme_gen[tt]\terme_s)
*entr\terme_gen[tt]\type_terme = $49-tt
*entr\terme_gen[tt]\lng_terme = 109-tt
*entr\terme_gen[tt]\terme_s = "Martin du Gard" + Str(9-tt)
EndIf
For a = 0 To 5
debn(tabl_2D(A, tt)\num_rub)
debc(tabl_2D(A, tt)\Nom_rub)
tabl_2D(A, tt)\num_rub = (a*5) + (tt*12)
tabl_2D(A, tt)\Nom_rub = "BOR" + Str((a*12) + (tt*5))
Next
Next
Debug "****** chargement zone de sortie ***********"
rtnprc\nb_elem_t = 4
debn(rtnprc\nb_elem_t)
For s = 0 To 3
rtnprc\t[s]\num_rub = s + 1
rtnprc\t[s]\nom_rub = "Rubr" + Str(s)
debn(rtnprc\t[s]\num_rub)
debc(rtnprc\t[s]\nom_rub)
; debh (@rtnprc\t[s]\num_rub)
; debh (@rtnprc\t[s]\nom_rub)
Next
Debug " ********** liste dans procédure ******"
AddElement(listex())
listex()\nb_elem_t = 3
For an = 0 To 3
listex()\t[an]\num_rub = (an*50)
listex()\t[an]\nom_rub = "R+list" + Str(an*50)
Next
ForEach Listex()
debn(listex()\nb_elem_t)
For sl = 0 To 3
debn(listex()\t[sl]\num_rub)
debc(listex()\t[sl]\nom_rub)
Next
Next
; rtnprc\type_erreur = 987
; rtnprc\rub_erreur = "Vous vous êtes trompés"
;hex_view(@rtnprc, 64)
debh(@rtnprc)
Debug @rtnprc
;ProcedureReturn @rtnprc\elem_tab_s[0]\num_rub
ProcedureReturn @rtnprc
EndProcedure
ent.entree
ent\nb_terme = 10
Debug " **************** entrée des données ****************"
; entrée des données dans le premier paramètre complexe
; ensuite dans le deuxième paramétre la table 2 dimensions
; ensuite troisième paramètre liste chainée
For t = 0 To 12
If t<10
ent\terme_gen[t]\type_terme = $41 + t
ent\terme_gen[t]\lng_terme = 100 + T
ent\terme_gen[t]\terme_s = "Durand_pp" + Str(t)
Debug "***** nouvelle entrée ****"
debn(t)
debn(ent\terme_gen[t]\type_terme)
debn(ent\terme_gen[t]\lng_terme)
debc(ent\terme_gen[t]\terme_s)
EndIf
AddElement(listea())
listea()\nb_elem_t = 4
For an = 0 To 5
tab2D(An, t)\num_rub = (an*12) + (t*5)
tab2D(An, t)\Nom_rub = "Rub" + Str((an*12) + (t*5))
debn(tab2D(An, t)\num_rub)
debc(tab2D(An, t)\Nom_rub)
If an<4
listea()\t[an]\num_rub = (T + an*5)
listea()\t[an]\nom_rub = "R_list" + Str(t + an*5)
EndIf
Next
Next
;***************************fin d'entrée des données *****************
;************************** appel de la procédure *****************
ADDx = edite(@ent, tab2d(), listea())
;ADDx = edite(@ent, tab2d())
; ***************************** vérification des 3 zones passées dans la procédure *******************
Debug "***** code sortie *******"
*err.tab_s = ADDx
; hex_view(addx, 64)
; debn(ADDx)
debh(addx)
debn(*err\nb_elem_t)
For ss = 0 To 3
Debug formn(*err\t[ss]\num_rub) + " " + formc(*err\t[ss]\nom_rub)
; debn(*err\t[ss]\num_rub)
; debc(*err\t[ss]\nom_rub)
; debh (@*err\t[ss]\num_rub)
; debh (@*err\t[ss]\nom_rub)
Next
; Debug "**********err"
; Debug *err\type_erreur
; Debug *err\rub_erreur
; Debug "**********peek"
; Debug PeekL(addx)
; Debug PeekS(addx + 2)
; ;
Debug "************** modif ou pas ************"
For t = 0 To 12
terme_rec.s = ""
If t<10
; debn(t)
; debn(ent\terme_gen[t]\type_terme)
; debn(ent\terme_gen[t]\lng_terme)
; debc(ent\terme_gen[t]\terme_s)
Debug formn(t) + " " + formn(ent\terme_gen[t]\type_terme) + " " + formn(ent\terme_gen[t]\lng_terme) + " " + formc(ent\terme_gen[t]\terme_s)
zones.s = ""
For c = 0 To 15
terme_rec + Chr(ent\terme_gen[t]\terme_c[c])
zones + Chr(ent\terme_gen[t]\terme_c[c]) + " "
Next
Debug " reconstruction=" + zones
EndIf
For an = 0 To 5
Debug formn(tab2D(An, t)\num_rub) + " " + formc(tab2D(An, t)\Nom_rub)
; debn(tab2D(An, t)\num_rub)
; debc(tab2D(An, t)\Nom_rub)
;
Next
debc(terme_rec)
Next
ForEach Listea()
debn(listea()\nb_elem_t)
For sl = 0 To 3
; debn(listea()\t[sl]\num_rub)
; debc(listea()\t[sl]\nom_rub)
Debug formn(listea()\t[sl]\num_rub) + " " + formc(listea()\t[sl]\nom_rub)
Next
Next