Optimisation de la Commande Mid

Sujets variés concernant le développement en PureBasic
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Optimisation de la Commande Mid

Message 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 )

Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
nn a512
Messages : 7
Inscription : ven. 31/mars/2006 22:16

Message par nn a512 »

Le vitesse est rapide parce que Mid2() ne contrôle pas le longueur en le string. Dangereux mais rapide. ;)
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message 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... :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Répondre