Optimisation de la Commande Mid
Publié : mar. 24/oct./2006 14:42
J'ai trouvé ca sur le forum anglais, un remplacant pour la commande mid creé par Trond, j'ai un peu modifié le code de fin pour verifier les affirmations des posteurs, le resultas se passe de commentaire, a priori, il semblerait que la routine de trond est 10 fois plus rapide que celle de purebasic, encore plus bizarre, augmentez la valeur de la variable 'TailleChaine' par exemple a 10000, la commande native 'mid' est largement surpassé, il semblerait que plus la chaine de traitement est grande, plus la commande mid native est moins efficace...
il y'a egallement un autre code de technicorn ici :
http://www.purebasic.fr/english/viewtop ... 32&start=0
mais je ne l'ai pas testé car il faut apparement changer le compilateur fasm de purebasic pour le remplacer par une autre version, j'ai trouvé celui de Trond beaucoup plus pratique et conci...
A mon avis, l'auteur de purebasic devrait revoir la commande mid car une telle difference de vitesse est aberrante surtout que cette commande est souvent utilisé, en plus a quoi bon permettre la gestion de chaine illimité en taille si le temps de traitement ne suit pas...
il y'a egallement un autre code de technicorn ici :
http://www.purebasic.fr/english/viewtop ... 32&start=0
mais je ne l'ai pas testé car il faut apparement changer le compilateur fasm de purebasic pour le remplacer par une autre version, j'ai trouvé celui de Trond beaucoup plus pratique et conci...
A mon avis, l'auteur de purebasic devrait revoir la commande mid car une telle difference de vitesse est aberrante surtout que cette commande est souvent utilisé, en plus a quoi bon permettre la gestion de chaine illimité en taille si le temps de traitement ne suit pas...
Code : Tout sélectionner
; Codé par Trond
Macro Mid2(String, StartPos, Length)
MidAscii(@String, StartPos, Length)
EndMacro
Procedure.s MidAscii(String, StartPos, Length)
!MOV eax, [p.v_String]
!ADD eax, [p.v_StartPos]
!DEC eax
!MOV edx, eax
!ADD eax, [p.v_Length]
!MOV cl, byte [eax]
!PUSH ecx
!MOV byte [eax], 0
!MOV ebx, eax
!PUSH dword [_PB_StringBasePosition]
!CALL _SYS_CopyString@0
!POP eax
!ADD eax, [PB_StringBase]
!POP ecx
!MOV byte [ebx], cl
ProcedureReturn
ProcedureReturn ""
EndProcedure
TailleChaine=300
VeryLongString.s = Space(TailleChaine)+"AAAABBBBCCCCDDDD"
TailleChaine+5
;Debug Mid2(VeryLongString, TailleChaine, 4):End
CR.s=Chr(13)
#Tries = 10000000
time = GetTickCount_()
For I = 0 To #Tries
Mid(VeryLongString, TailleChaine, 4)
Next
Resmid=GetTickCount_()-time
time = GetTickCount_()
For I = 0 To #Tries
Mid2(VeryLongString, TailleChaine, 4)
Next
Resmid2=GetTickCount_()-time
MessageRequester(""," Purebasic Mid : "+ Str(Resmid) + CR + " Mid2 = " + Str(Resmid2) + CR + " Environ "+ Str(Resmid/Resmid2) + " fois plus rapide",#PB_MessageRequester_Ok )