Page 1 sur 1

Compare vitesse d’exécution entre tab en struct et tab(x,y)

Publié : lun. 12/janv./2009 11:37
par PAPIPP
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)

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
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

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)

Le troisième programme reprend tous les principes des deux prg précédents avec des structures plus complexes

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