Publié : sam. 01/janv./2005 18:27
@Dri : pas de problème. Je ferai un swap qui ne crée pas de zone mémoire temporaire.
Maintenant le jeu de commandesMMX est integré dans les processeurs.hardy a écrit : @denis : oui, je connais le code. déjà vu sur divers sites, dont intel.
Pour un maximum de compatibilité je vais faire sans mmx. J'ai testé : n'augmente pas considérablement la vitesse pour ce que je fais.
Ah bah ca rien que pou le principe ca m'intéresse !!hardy a écrit :@Dri : pas de problème. Je ferai un swap qui ne crée pas de zone mémoire temporaire.
Code : Tout sélectionner
Swap(*mem1,*mem2,taille)
Echange des zones mémoires. Ne doivent pas s'intersecter.
EliminateL(*mem,n.l,taille)
Cherche, de 4 octets en 4 octets, l'ocurrence de n dans la zone commençant à *mem, de longueur
taille et les élimine
taille devrait être un multiple de 4. (sinon, arrondie au multiple de 4 précédent).
renvoit la taille de la zone mémoire obtenue, commençant toujours à l'adresse *mem.
EliminateW(*mem,n.W,taille)
Cherche, de 2 octets en 2 octets, l'ocurrence de n dans la zone commençant à *mem, de longueur
taille et les élimine.
taille devrait être un multiple de 2. (sinon, arrondie au multiple de 2 précédent).
renvoit la taille de la zone mémoire obtenue, commençant toujours à l'adresse *mem.
EliminateB(*mem,n.b,taille)
Cherche, d'octet en octet, l'ocurrence de n dans la zone commençant à *mem, de longueur
taille et les élimine.
renvoit la taille de la zone mémoire obtenue, commençant toujours à l'adresse *mem.
Code : Tout sélectionner
RGBtoBGR(*mem,taille)
convertit les longs de la zone mémoire commençant à mem, et de longueur taille, du format
00RRGGBB au format 00BBGGRR.
taille devrait être un multiple de 4. (sinon, arrondie au multiple de 4 précédent).
Code : Tout sélectionner
#nb = 10000000
Dim couleur.l(10000000)
couleur(0) = RGB(200, 100, 50); pour vérifier...
couleur(10000000) = RGB(33, 17, 18)
If OpenLibrary(0,"c:\memory.dll")
*convert=IsFunction(0,"RGBtoBGR")
If *convert
temps1 = ElapsedMilliseconds()
For i = 1 To #nb
couleur(i) = RGB(Blue(couleur(i)), Green(couleur(i)), Red(couleur(i)))
Next
temps2 = ElapsedMilliseconds()
CallFunctionFast(*convert,@couleur(),4*10000001)
Temps3 = ElapsedMilliseconds()
MessageRequester("Test rapidité", "Solution 1 : " + Str(temps2 - temps1) +Chr(10)+ " Solution 2 : " + Str(Temps3 - temps2), 0)
EndIf
EndIf
Code : Tout sélectionner
ProcedureDLL CompareMemString(source,dest,flag)
Select flag
Case 0 ; case sensitive
MOV esi,source
MOV edi,dest
!MOV eax,0
!bouclecms:
!MOV ebx,[esi]
!MOV edx,[edi]
!CMP bl,0
!JE fincms1
!CMP dl,0
!JE fincms2
!CMP bl,dl
!JA cmssup
!JB cmsinf
!CMP bh,0
!JE fincms1h
!CMP dh,0
!JE fincms2h
!CMP bh,dh
!JA cmssup
!JB cmsinf
!ROL ebx,16
!ROL edx,16
!CMP bl,0
!JE fincms1
!CMP dl,0
!JE fincms2
!CMP bl,dl
!JA cmssup
!JB cmsinf
!CMP bh,0
!JE fincms1h
!CMP dh,0
!JE fincms2h
!CMP bh,dh
!JA cmssup
!JB cmsinf
!ADD esi,4
!ADD edi,4
!JMP bouclecms
!fincms1:
!CMP dl,0
!JE fincms
!MOV eax,-1
!JMP fincms
!fincms2:
!CMP bl,0
!JE fincms
!MOV eax,1
!JMP fincms
!fincms1h:
!CMP dh,0
!JE fincms
!MOV eax,-1
!JMP fincms
!fincms2h:
!CMP bh,0
!JE fincms
!MOV eax,1
!JMP fincms
!cmssup:
!MOV eax,1
!JMP fincms
!cmsinf:
!MOV eax,-1
!fincms:
ProcedureReturn
Case 1
EndSelect
EndProcedure
Code : Tout sélectionner
format MS COFF
public PB_CompareMemString
; --------------------------------------;
; Syntaxe PureBasic ;
; ;
; CompareMemString(source,dest,flag) ;
; ;
; --------------------------------------;
; --------------------------------------;
; équivalence ;
; --------------------------------------;
Decalage = (Fin_Decalage-Debut_Decalage)*4
; --------------------------------------;
; Paramètres d'entrée ;
; --------------------------------------;
; flag.l
flag equ dword [esp+Decalage+12]
; dest.l
dest equ dword [esp+Decalage+8]
; source.l
source equ dword [esp+Decalage+4]
; --------------------------------------;
; Section code ;
; --------------------------------------;
section '.text' code readable executable
PB_CompareMemString:
Debut_Decalage:
PUSH ebx
PUSH esi
PUSH edi
Fin_Decalage:
MOV eax, flag
TEST eax, eax
JNZ fincms
; Case 0 ; case sensitive
MOV esi,source
MOV edi,dest
MOV eax,0
bouclecms:
MOV ebx,[esi]
MOV edx,[edi]
CMP bl,0
JE fincms1
CMP dl,0
JE fincms2
CMP bl,dl
JA cmssup
JB cmsinf
CMP bh,0
JE fincms1h
CMP dh,0
JE fincms2h
CMP bh,dh
JA cmssup
JB cmsinf
ROL ebx,16
ROL edx,16
CMP bl,0
JE fincms1
CMP dl,0
JE fincms2
CMP bl,dl
JA cmssup
JB cmsinf
CMP bh,0
JE fincms1h
CMP dh,0
JE fincms2h
CMP bh,dh
JA cmssup
JB cmsinf
ADD esi,4
ADD edi,4
JMP bouclecms
fincms1:
CMP dl,0
JE fincms
MOV eax,-1
JMP fincms
fincms2:
CMP bl,0
JE fincms
MOV eax,1
JMP fincms
fincms1h:
CMP dh,0
JE fincms
MOV eax,-1
JMP fincms
fincms2h:
CMP bh,0
JE fincms
MOV eax,1
JMP fincms
cmssup:
MOV eax,1
JMP fincms
cmsinf:
MOV eax,-1
fincms:
POP edi
POP esi
POP ebx
RET 12
Code : Tout sélectionner
; Langage utilisé pour coder la librairie ASM ou C
ASM
; Nombre de Dll windows utilisée par la lib
0
; Type de librairie
LIB
; Aucune librairies PureBasic & utilisateur utilisé par la librairie
0
; Nom du fichier d'aide de notre libraire, OBLIGATOIRE !
CompareMemString.chm
; Enumération des nouvelles fonctions crées
CompareMemString, String, String, Long, ()
Long | StdCall
Code : Tout sélectionner
source$ = "DenisDenisDenisDenisDenisDenisDenisDenisDenisDenis"
dest$ = source$
temp=GetTickCount_()
For i = 0 To 50000000
a = CompareMemString(source$,dest$,0)
Next i
Valeur$ = "Résultat de CompareMemString() : "+Str(GetTickCount_()-temp)+Chr(10)
temp=GetTickCount_()
For i = 0 To 50000000
a = CompareMemoryString(source$,dest$,0)
Next i
Valeur$ + "Résultat de la fonction PureBasic : "+Str(GetTickCount_()-temp)+Chr(10)+Chr(10)
source$ = "DenisDenisDenisDenisDenisDenisDenisDenisDenisDenis"
dest$ = "aenisDenisDenisDenisDenisDenisDenisDenisDenisDenis"
temp=GetTickCount_()
For i = 0 To 50000000
a = CompareMemString(source$,dest$,0)
Next i
Valeur$ + "Résultat de CompareMemString() : "+Str(GetTickCount_()-temp)+Chr(10)
temp=GetTickCount_()
For i = 0 To 50000000
a = CompareMemoryString(source$,dest$,0)
Next i
Valeur$ + "Résultat de la fonction PureBasic : "+Str(GetTickCount_()-temp)+Chr(10)+Chr(10)
source$ = "DenisDenisDenisDenisDenisDenisDenisDenisDenisDenis"
dest$ = "DenisDenisDenisDenisDenisDenisDenisDenisDenisDenas"
temp=GetTickCount_()
For i = 0 To 50000000
a = CompareMemString(source$,dest$,0)
Next i
Valeur$ + "Résultat de CompareMemString() : "+Str(GetTickCount_()-temp)+Chr(10)
temp=GetTickCount_()
For i = 0 To 50000000
a = CompareMemoryString(source$,dest$,0)
Next i
Valeur$ + "Résultat de la fonction PureBasic : "+Str(GetTickCount_()-temp)
MessageRequester("Résultats pour 50000000 itérations",valeur$,16)