Page 1 sur 2
Hexa to Val
Publié : jeu. 11/août/2022 11:31
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

Re: Hexa to Val
Publié : jeu. 11/août/2022 12:22
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

Re: Hexa to Val
Publié : jeu. 11/août/2022 12:36
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
Re: Hexa to Val
Publié : jeu. 11/août/2022 12:57
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)
Re: Hexa to Val
Publié : jeu. 11/août/2022 14:17
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
Re: Hexa to Val
Publié : jeu. 11/août/2022 16:18
par Ollivier
Code : Tout sélectionner
a.q = $0102030405060708
For c = 56 To 0 Step -8
Debug (a >> c) & $FF
Next
Re: Hexa to Val
Publié : jeu. 11/août/2022 16:42
par SPH
Merci Ollivier.
... mais, pourrais-tu recommencer ton code en commençant par :
C'est en arrivent a cette condition que je bloque.
A moins que tu arrives a transformer mon texte$ en ton a.q
Merci

Re: Hexa to Val
Publié : jeu. 11/août/2022 18:16
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$)
Re: Hexa to Val
Publié : ven. 12/août/2022 1:22
par Ollivier
Bon ben voilà... Procédure... Syntaxe :
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
Re: Hexa to Val
Publié : ven. 12/août/2022 8:51
par SPH
bon... cher Ollivier... comment te dire !
... t'arrive t'il de poster un code fonctionnel ?

Re: Hexa to Val
Publié : ven. 12/août/2022 9:07
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'
Re: Hexa to Val
Publié : ven. 12/août/2022 12:16
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...
Re: Hexa to Val
Publié : ven. 12/août/2022 12:33
par Ollivier
Je retourne compresser mes nombres premiers. À +

Re: Hexa to Val
Publié : ven. 12/août/2022 12:37
par SPH
... compresse mon petit, compresse !

Re: Hexa to Val
Publié : sam. 13/août/2022 1:11
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...