je ne suis plus là je ne répondrais plus a ce message XD
Hexa to Val
Re: Hexa to Val
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
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
par
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 :
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 2Code : Tout sélectionner
lg= Len(texte$)
For i=1 To lg Step 2methode 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
EndProcedureRe: Hexa to Val
Merci manababel (et aux autres). En effet, je gagne un peu en mettant :
au lieu de :
... 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

Code : Tout sélectionner
len= Len(texte$)
For i=1 To len Step 2
Code : Tout sélectionner
For i=1 To Len(texte$) Step 2
Merci à tous... et si vous avez une Nème méthode, postez la
!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
Re: Hexa to Val
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 :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)
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 lecture0) 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
Une Nème méthode utilisant un structuré pointer:
@Edit: Correction faite
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$)
Dernière modification par Demivec le lun. 15/août/2022 23:04, modifié 1 fois.
Re: Hexa to Val
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
Sauf qu'il y a une erreur dans ton code. Ca ne donne pas les bonnes valeurs après 3 bons résultats
!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
Re: Hexa to Val
Attends, je corrige son petit bug...
And the winner is... Demivec ! Yea ! !
Shorter, quicker and cleaner !
(Plus court, plus rapide et plus propre)
BRAVO !Bon... eh... tu viens voir les nombres premiers, ou bien ? C'est quoi ta vielle vanne de mal au crâne ?
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