Page 2 sur 2

Re: Hexa to Val

Publié : sam. 13/août/2022 1:30
par case
:mrgreen: on dirais un post a la D.

je ne suis plus là je ne répondrais plus a ce message XD

Re: Hexa to Val

Publié : sam. 13/août/2022 7:13
par Ollivier
:o

Un pointeur c'est comme un animal, sur un chemin, qui va brouter à tel ou tel endroit dans la mémoire. C'est comme un index d'un seul et grand tableau qui ferait la taille de la mémoire accessible par le programme. Pas si compliqué que ça...

Re: Hexa to Val

Publié : sam. 13/août/2022 21:42
par manababel
bonjour
Après un message passé inaperçu, voici une 4e méthode ( pointer + tableau )
j'ai un peut modifier le programme de SPH , et le voici aussi performant que le programme utilisant un tableau

la première optimisation a été de remplacer

Code : Tout sélectionner

For i=1 To Len(texte$) Step 2
par

Code : Tout sélectionner

lg= Len(texte$)
For i=1 To lg Step 2
voici les résultats obtenus avec la ligne : For i=1 To Len(texte$) Step 2
methode sph : 35 ms pour 100000 boucle
methode tableau : 36
methode map : 34
metode 4 : 16

et avec : For i=1 To lg Step 2
methode sph : 27
methode tableau : 29
methode map : 25
metode 4 : 5

programme de test :

Code : Tout sélectionner

Global texte$=UCase("01020345f8c6deffcb")
Global Dim result(4,(Len(texte$)/2))
Dim t(5)

Declare shp(x)
Declare tableau(x)
Declare Maps(x)
Declare pointer(x)

iter = 100000

t(0) = shp(iter)
t(1) = tableau(iter)
t(2) = Maps(iter)
t(3) = pointer(iter)

z$ = "methode sph" + Chr(9) +  "methode tableau" + Chr(9) + "methode map" + Chr(9)+ "pointer et tableau" +Chr(13)
For s=0 To (Len(texte$)/2)-1
  For r=0 To 3
    z$ = z$ + Str(result(r,s)) + Chr(9) + Chr(9)
  Next
  ;z$ = z$ + Chr(13)
Next
z$ = z$ + Chr(13) + "temps" + Chr(13)
For i = 0 To 3
  z$ = z$ + Str(t(i)) + Chr(9) + Chr(9)
Next

MessageRequester("results",z$,#PB_MessageRequester_Ok)
; ---------------------------------------------------------
; methode sph
Procedure shp(iter)
  t=ElapsedMilliseconds()
  For z=1 To iter
    lg= Len(texte$)
    For i=1 To lg Step 2
      result(0,(i-1)>>1) = Val("$"+Mid(texte$,i,2))
    Next
  Next
  t= ElapsedMilliseconds()-t
  ProcedureReturn t
EndProcedure

; ---------------------------------------------------------
; methode tableau
Procedure tableau(iter)
  t=ElapsedMilliseconds()
  Dim cha(255)
  For A=48 To 57 ; numbers
    cha(a)=a-48  ; 0 to 9
  Next
  For a=65 To 70; a to f
    cha(a)=a-55 ; 10 to 15
    cha(a+32)=a-55
  Next
  
  For z=1 To iter
    lg= Len(texte$)
    For i=1 To lg Step 2
      result(1,(i-1)>>1) = cha(Asc(Mid(texte$,i,1)))<<4+cha(Asc(Mid(texte$,i+1,1)))
    Next
  Next
  t= ElapsedMilliseconds()-t
  ProcedureReturn t
EndProcedure

; ---------------------------------------------------------
; methode map
Procedure Maps(iter)
  t=ElapsedMilliseconds()
  NewMap Hx.i()
  For z=0 To 255
    AddMapElement(Hx(),RSet(Hex(z),2,"0"))
    Hx()=z
  Next
  
  k=ElapsedMilliseconds()
  For z=1 To iter

    lg= Len(texte$)
    For i=1 To lg Step 2
      FindMapElement(hx(),Mid(texte$,i,2))        
      result(2,(i-1)>>1) = hx()     
    Next
  Next
  t= ElapsedMilliseconds()-t
  ProcedureReturn t
EndProcedure

; ---------------------------------------------------------
; pointer et tableau
Procedure pointer(iter)
  t=ElapsedMilliseconds()
  p=@texte$
  Dim cha(255)
  For A=48 To 57 ; numbers
    cha(a)=a-48  ; 0 to 9
  Next
  For a=65 To 70; a to f
    cha(a)=a-55 ; 10 to 15
    cha(a+32)=a-55
  Next
  
  For z=1 To iter
    lg= Len(texte$)
    For i=1 To lg Step 2
      result(3,(i-1)>>1) = cha(PeekA(p+(i-1)<<1))<<4 + cha(PeekA(p+i<<1))
    Next
  Next
  t= ElapsedMilliseconds()-t
  ProcedureReturn t
EndProcedure

Re: Hexa to Val

Publié : dim. 14/août/2022 13:00
par SPH
Merci manababel (et aux autres). En effet, je gagne un peu en mettant :

Code : Tout sélectionner

  len= Len(texte$)
For i=1 To len Step 2
au lieu de :

Code : Tout sélectionner

For i=1 To Len(texte$) Step 2
... mais je suis loin de ta méthode qui est plus rapide.

Merci à tous... et si vous avez une Nème méthode, postez la :P :idea:

Re: Hexa to Val

Publié : lun. 15/août/2022 11:47
par Ollivier
Ma méthode est plus simple et plus rapide que celle de manababel : son désaventage est qu'elle prend un tableau de 7 mégaooctets, y répartit une pincée de valeurs, et n'utilise que cette pincée de valeurs dans cet espace vide et gaspillé.

Un repérage pour les pointeurs, comme tu connais peek et poke :

Code : Tout sélectionner

Define *mem = AllocateMemory(64) ; allocation

Define *a.integer ; définition

*a = *mem ; attribution

If Pluie ; vérif de la météo
 PokeI(*a, 51) ; écriture
Else
 *a\i = 51 ; équivalent d'écriture
EndIf

Debug PeekI(*a) ; lecture
Debug *a\i  ; équivalent de lecture
Tu n'as pas plus à savoir sur la syntaxe des pointeurs dans un code source pureBasic :
0) allocation mémoire
1) définition *monPointeur.integer (ou quad ou long, ou byte, etc...)
2) attribution *monPointeur = *UneAdresseMemoire
3) lecture/écriture *monPointeur\i (ou q ou L ou b, etc... selon ta définition)

Re: Hexa to Val

Publié : lun. 15/août/2022 14:42
par Demivec
Une Nème méthode utilisant un structuré pointer:

Code : Tout sélectionner

Global texte$=UCase("01020345f8c6deffcb")
;
opt=0
If #PB_Compiler_Debugger : opt=1 : EndIf

iter=1
If opt = 0 : iter = 100000000 : EndIf


; ;----------------------------------------------------------
; ;Debug "methode sph"
; k=ElapsedMilliseconds()
; For z=1 To iter
;   lg= Len(texte$)
;   For i=1 To lg Step 2
;     a$="$"+Mid(texte$,i,2)
;     result =Val(a$)
;   Next
; Next
; sph.i= ElapsedMilliseconds()-k

;----------------------------------------------------------
;Debug "pointer"
k=ElapsedMilliseconds()
p=@texte$
Dim cha(255)
For A=48 To 57 ; numbers
  cha(a)=a-48  ; 0 to 9
Next
For a=65 To 70; a to f
  cha(a)=a-55 ; 10 to 15
  cha(a+32)=a-55
Next

For z=1 To iter
  lg= Len(texte$)
  For i=1 To lg Step 2
    r2 = cha(PeekA(p+(i-1)<<1))<<4 + cha(PeekA(p+i<<1))
    If opt = 1 
      a$="$"+Mid(texte$,i,2)
      result =Val(a$)
      Debug result
      Debug r2
      Debug "-----"
    EndIf
  Next
Next
my.i= ElapsedMilliseconds()-k

;----------------------------------------------------------
;Debug "structuré pointer"
k=ElapsedMilliseconds()
Structure asciiTableau
  a.a[0]  
EndStructure

*pd.asciiTableau = @texte$
Dim cha(255)
For A = 48 To 57 ; numbers
  cha(a) = a - 48 ; 0 to 9
Next
For a = 65 To 70 ; a to f
  cha(a) = a - 55 ; 10 to 15
  cha(a + 32) = a - 55
Next

For z = 1 To iter
  lg = Len(texte$)
  For i = 1 To lg Step 2
    r2 = cha(*pd\a[(i - 1) * 2]) * 16 + cha(*pd\a[i * 2])
    If opt = 1 
      a$="$"+Mid(texte$,i,2)
      result =Val(a$)
      Debug result
      Debug r2
      Debug "-----"
    EndIf
  Next
Next
dem.i = ElapsedMilliseconds() - k

; t1$ = "methode sph" + #LF$
; t1b$ = Str(sph) + #LF$
t2$ ="pointer" + #LF$
t2b$ = Str(my) + #LF$
t3$ = "structuré pointer" + #LF$
t3b$ = Str(dem) + #LF$
t$ = t1$ + t1b$ + t2$ + t2b$ + t3$ + t3b$
MessageRequester("", t$)
@Edit: Correction faite

Re: Hexa to Val

Publié : lun. 15/août/2022 14:52
par SPH
Merci Demivec

Sauf qu'il y a une erreur dans ton code. Ca ne donne pas les bonnes valeurs après 3 bons résultats :idea:

Re: Hexa to Val

Publié : lun. 15/août/2022 16:30
par Ollivier
Attends, je corrige son petit bug...

And the winner is... Demivec ! Yea ! !
Shorter, quicker and cleaner !
(Plus court, plus rapide et plus propre)
BRAVO !

Code : Tout sélectionner

*T= UTF8(Space(100) )
max= Base64Decoder("AQIDRfjG3v/L", *T, 100)- 1
For i= 0 To max
    Debug Hex(PeekA(*T+ i) )
Next
Bon... eh... tu viens voir les nombres premiers, ou bien ? C'est quoi ta vielle vanne de mal au crâne ?