Hexa to Val

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Hexa to Val

Message par SPH »

Salut,

J'aurais juste voulu savoir comment vous feriez ca mais en plus rapide (et en plus propre) :

Code : Tout sélectionner

texte$="01020345f8c6deffcb"
For i=1 To Len(texte$) Step 2
  a$="$"+Mid(texte$,i,2)
  Debug a$+" = "+Str(Val(a$))
Next
Danke :P

!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
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Hexa to Val

Message par falsam »

SPH a écrit : jeu. 11/août/2022 11:31 J'aurais juste voulu savoir comment vous feriez ca mais en plus rapide (et en plus propre)
Ben ... non :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Hexa to Val

Message par case »

bon j'ai teste plusieurs méthodes possibles.(je sais pas si c'est plus propre )
un tableau avec les valeurs ascii
une table avec en cle les valeurs hexa


apres pour 100000 iterations ( sans affichage via debug ) la difference reste minime...

etrangement
sans debug du résultat la méthode tableau semble la plus rapide (ce qui semble normal) ensuite la methode map et enfin la methode utilisée par sph
100000 iterations
methode map
118
methode tableau
96
methode sph
166

avec le debug les resultats donnent la methode sph en premier puis la methode tableau enfin la methode map.
100 iterations (trop long a cause de l'affichage du debug pour un resultat sur 100000 iterations
methode map
219
methode tableau
198
methode sph
169


Code : Tout sélectionner

 texte$=UCase("01020345f8c6deffcb")
 ;
 deb=01  ; active ou non l'affichage des valeurs
 
 
 If deb=1
   iter=100
 Else
   iter=100000
 EndIf
 
   
   
   
Debug "methode sph"
k=ElapsedMilliseconds()
For z=1 To iter
For i=1 To Len(texte$) Step 2
  a$="$"+Mid(texte$,i,2)
  result =Val(a$)
  If deb  : Debug result : EndIf
Next
Next

sph.i= ElapsedMilliseconds()-k
;


Debug "methode tableau"
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



k=ElapsedMilliseconds()
For z=1 To iter
For i=1 To Len(texte$) Step 2
  result=cha(Asc(Mid(texte$,i,1)))*16+cha(Asc(Mid(texte$,i+1,1)))
  If deb  : Debug result : EndIf

Next
Next
tableau.i= ElapsedMilliseconds()-k


Debug "methode map"


NewMap Hx.i()
For z=0 To 255
 ; Debug RSet(Hex(z),2,"0")
  AddMapElement(Hx(),RSet(Hex(z),2,"0"))
  Hx()=z
Next

k=ElapsedMilliseconds()
For z=1 To iter
  For i=1 To Len(texte$) Step 2
    FindMapElement(hx(),Mid(texte$,i,2))        
    result= hx()      
  If deb  : Debug result : EndIf
Next
Next
Debug "methode map"
Debug ElapsedMilliseconds()-k
Debug "methode tableau"
Debug tableau
Debug "methode sph"
Debug sph



ImageImage
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

Message par SPH »

Il est intéressant de mettre le Elapsemillisecond au tout début du code désigné. Sans ça, on ne prend pas en compte le temps de travail préliminaire.

Code : Tout sélectionner

 texte$=UCase("01020345f8c6deffcb")
 ;
 deb=0  ; active ou non l'affichage des valeurs
 
 If deb=1
   iter=100
 Else
   iter=100000
 EndIf
 
;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;
   
Debug "methode sph"
k=ElapsedMilliseconds()
For z=1 To iter
For i=1 To Len(texte$) Step 2
  a$="$"+Mid(texte$,i,2)
  result =Val(a$)
  If deb  : Debug result : EndIf
Next
Next

sph.i= ElapsedMilliseconds()-k

;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;

Debug "methode tableau"

k=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
For i=1 To Len(texte$) Step 2
  result=cha(Asc(Mid(texte$,i,1)))*16+cha(Asc(Mid(texte$,i+1,1)))
  If deb  : Debug result : EndIf

Next
Next
tableau.i= ElapsedMilliseconds()-k

;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;

Debug "methode map"

k=ElapsedMilliseconds()
NewMap Hx.i()
For z=0 To 255
 ; Debug RSet(Hex(z),2,"0")
  AddMapElement(Hx(),RSet(Hex(z),2,"0"))
  Hx()=z
Next

For z=1 To iter
  For i=1 To Len(texte$) Step 2
    FindMapElement(hx(),Mid(texte$,i,2))        
    result= hx()      
  If deb  : Debug result : EndIf
Next
Next

;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;

Debug ";;;;;;;;;;;;;;;;;;;;;"
Debug "methode map"
Debug ElapsedMilliseconds()-k
Debug "methode tableau"
Debug tableau
Debug "methode sph"
Debug sph
Qui aurait un code qui puisse rivaliser avec ces 3 codes ?

Merci

ps : je poste souvent en ce moment car "PQVLFF" (Pour Que Vive Le Forum Français)

!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
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Hexa to Val

Message par case »

le travail préliminaire est fait une seule fois pour toute alors que l'utilisation peut être fait tout au long du programme.
c'est dans ce genre de cas anecdotique
ImageImage
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Hexa to Val

Message par Ollivier »

Code : Tout sélectionner

a.q = $0102030405060708
For c = 56 To 0 Step -8
 Debug (a >> c) & $FF
Next
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

Message par SPH »

Merci Ollivier.

... mais, pourrais-tu recommencer ton code en commençant par :

Code : Tout sélectionner

texte$="01020345f8c6deffcb"
C'est en arrivent a cette condition que je bloque.
A moins que tu arrives a transformer mon texte$ en ton a.q

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

Re: Hexa to Val

Message par manababel »

voici une version plus rapide
c'est un melange de "pointer" et de tableau
et remplacé la ligne suivante :
For i=1 To len(texte$) Step 2
par :
lg= Len(texte$)
For i=1 To lg Step 2

Code : Tout sélectionner

Global texte$=UCase("01020345f8c6deffcb")
 ;
 opt=0
 If #PB_Compiler_Debugger : opt=1 : EndIf
 
 iter=1
 If opt = 0 : iter = 1000000 : 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 "methode tableau"
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

k=ElapsedMilliseconds()
For z=1 To iter
lg= Len(texte$)
  For i=1 To lg Step 2
  result=cha(Asc(Mid(texte$,i,1)))*16+cha(Asc(Mid(texte$,i+1,1)))
Next
Next
tableau.i= ElapsedMilliseconds()-k

;----------------------------------------------------------
;Debug "methode map"


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= hx()      
Next
Next
mapt = 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



t1$="methode map"+Chr(13)
t2$=Str(mapt)+Chr(13)
t3$="methode tableau"+Chr(13)
t4$=Str(tableau)+Chr(13)
t5$="methode sph"+Chr(13)
t6$=Str(sph)+Chr(13)
t7$="pointer"+Chr(13)
t8$=Str(my)+Chr(13)
t$=t1$+t2$+t3$+t4$+t5$+t6$+t7$+t8$
MessageRequester("",t$)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Hexa to Val

Message par Ollivier »

Bon ben voilà... Procédure... Syntaxe :

Code : Tout sélectionner

convert(@a$, Len(a$), @e(0) )
Ici, e() c'est ton tableau d'octets (type ascii '.a').
Je suis un peu culotté, mais je crois que c'est la plus rapide.
Le coeur c'est ça :

Code : Tout sélectionner

LenA / 2
 While LenA
  LenA - 1
  *dest\a = homeMadeMap(*source\L)
  *source + 4
  *dest + 1
 Wend
Et la procédure est ici (minuscules obligatoires ici) :

Code : Tout sélectionner

Procedure convert(*source.long, LenA, *dest.ascii)
 Static u
 If u = 0
  Global Dim homeMadeMap.a('ff')
  For u = 0 To 255
   B$ = RSet(Hex(u), 2, "0")
   homeMadeMap(PeekL(@B$) | $200020) = u
  Next
 EndIf
;-)
 LenA / 2
 While LenA
  LenA - 1
  *dest\a = homeMadeMap(*source\L)
  *source + 4
  *dest + 1
 Wend
EndProcedure
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

Message par SPH »

bon... cher Ollivier... comment te dire !
... t'arrive t'il de poster un code fonctionnel ? 8O

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

Oui, et c'est le zéro qui te bloque. Pour faire plus rapide, faudra threader, mais je préfère laisser l'honneur à tout contributeur qui souhaite aller plus vite, et que tu peux remercier. Moi, je rajouterai juste les majuscules si tu les veux !

Code : Tout sélectionner

a$ = "ca55ebaffe"
L = Len(a$)
Dim code.a(L / 2)

convert(@a$, L, @code(0) ) ; oublie pas le zéro '0'
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

Message par SPH »

Mouai, je ne sais pas si c'est rapide mais on peux dire que c'est plus long que ma méthode...

De plus, étant nul en pointeur et adressage mémoire, je ne sais pas "debugguer" chaque résultat...

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

Je retourne compresser mes nombres premiers. À +
8)
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Hexa to Val

Message par SPH »

... compresse mon petit, compresse ! :D :wink:

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

Peut-être que tu devrais faire honneur à case qui met des mesures et à manababel qui montre une technique rapide, en postant toi-même un code de benchmark. Ça te coûte du temps, mais ça te rapporte de savoir le faire Et puis c'est aussi ça peut-être faire vivre le forum.

Le code de manababel pioche au caractère près d'une chaïne. C'est moins rapide que le mien qui en pioche 2 d'un coup. Mais son code permet changer de base jlà, on est sur la base hexa, mais ça peut-être base 8, base64 etc...

Il y a beaucoup à dire...
Répondre