Hexa to Val

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Hexa to Val

Message par case »

:mrgreen: on dirais un post a la D.

je ne suis plus là je ne répondrais plus a ce message XD
ImageImage
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Hexa to Val

Message 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...
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: Hexa to Val

Message 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
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Hexa to Val

Message 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)
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Hexa to Val

Message 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
Dernière modification par Demivec le lun. 15/août/2022 23:04, modifié 1 fois.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Hexa to Val

Message 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 ?
Répondre