Page 1 sur 1

Optimisation de la Commande Mid

Publié : mar. 24/oct./2006 14:42
par Coolman
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...

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 )


Publié : mar. 24/oct./2006 17:06
par Dr. Dri
18 fois plus rapide sur une very long string :-?
de toute facon j'utilise jamais Mid mais là faut avouer que c'est énorme

Dri

Publié : mar. 24/oct./2006 20:33
par nn a512
Le vitesse est rapide parce que Mid2() ne contrôle pas le longueur en le string. Dangereux mais rapide. ;)

Publié : mer. 25/oct./2006 11:17
par Coolman
Dr Dri, met 30000 a la variable 'TailleChaine' pour le test sur une chaine de 30 ko, tu seras encore plus surpris 8O
de la difference (desactive le mode debogueur, sinon c'est trop lent )...


nn a512 (bizarre le pseudo), c'est vrai mais il est possible d'utiliser la routine technicorn qui fait ce type de controle avec une rapidité moindre quand meme environ 3 a 5 fois plus rapide que la commande native mid... :)

Publié : jeu. 26/oct./2006 6:25
par Dr. Dri
nn a512 a écrit :Le vitesse est rapide parce que Mid2() ne contrôle pas le longueur en le string. Dangereux mais rapide. ;)
non ca a été mon premier test, en faisant un mid qui démarre à 4 sur une longueur de 1000000 y'a aucun souci... je pense plutot que dans la fonction Mid native ce test est redondant

Dri