Dll et tableaux

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Moi aussi j'ai fait l'exercice :D
Avec un test de vitesse entre pointeur et ASM ...

Code : Tout sélectionner

chaine.s="Pure Basic is the Best" 
chaine1.s=Space(Len(chaine)) 
Longueur = Len(chaine)
          
;/        Avec pointeur
Time1 = GetTickCount_()
For t=1 To 1000000
          *PtrChaine.BYTE = @chaine + Longueur -1
          *PtrChaine1.BYTE = @chaine1
          For p=0 To Longueur
                    *PtrChaine1\b = *PtrChaine\b
                    *PtrChaine1 + 1
                    *PtrChaine - 1
          Next
          *PtrChaine1\b = 0
Next
;Debug chaine1
Time2 = GetTickCount_()
;/        Avec registre ASM
For t=1 To 1000000
          !MOV    ecx,dword [v_Longueur]
          !MOV    edx,dword [v_chaine]
          !ADD     edx,ecx
          !DEC     edx
          !MOV    ebx,dword[v_chaine1]
          !Encore:
                    !MOV    al,byte[edx]
                    !MOV    byte[ebx],al
                    !DEC     edx
                    !INC     ebx
                    !DEC     ecx
          !JNZ Encore
          !MOV   byte[ebx],0
Next
;Debug chaine1
Time3 = GetTickCount_()
;/        Resultat
Message$ = "Avec pointeur : "+Str(Time2-Time1)+" ms"+Chr(13)
Message$ + "Avec registre ASM : "+Str(Time3-Time2)+" ms"
MessageRequester("Test de vitesse",Message$,#PB_MessageRequester_Ok)
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

Ah! je croyais être le seul à faire les exo... :wink:, mais bon la deuxième partie de ton code... euh... j'y pipe quedalle! Et le plus fort c'est que je veux meme essayer de comprendre ! :)

Celà dit, la différence de vitesse est impressionnante :

~7 fois plus vite pour l'ASM!
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

~7 fois plus vite pour l'ASM!
Sur mon ordi c'est ~2.7 fois plus vite en moyen...Bizarre :!:
Y a t'il une autre personne qui pourrait faire le test ?
euh... j'y pipe quedalle! Et le plus fort c'est que je veux meme essayer de comprendre !

je t'y encourage :D

Code : Tout sélectionner

 chaine.s = "PureBasic + l'ASM is the Best"
:D :D :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Salut, erix14

5.6 fois plus vite
*pointeur:280
asm:50

C'est quoi la dfférence avec l'asm généré de Pb?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

---------------------------
Test de vitesse
---------------------------
Avec pointeur : 125 ms
Avec registre ASM : 47 ms
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Salut erix14 !

Sur 98SE avec PIII 500:
Avec pointeur : 915ms
Avec registre ASM: 234ms


En meme temps, j'peux pas m'empêcher de comparer avec nico et comtois... je suis vraiment à la ramasse :lol:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

:lol:

j'ai un P4 2,66
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

T u sais Dräc, tu peux trouver un kit carte mère processeur ventilo pour pas trop chère!

:)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

nico a écrit :T u sais Dräc, tu peux trouver un kit carte mère processeur ventilo pour pas trop chère!

:)
Ouaip ! Mais avec un portable, je pense que cela risque d’etre plutot acrobatique comme solution, ne penses-tu pas ? ;)
Par contre, je serais tenté par trouver la bonne affaire sur eBay à l’instar de hardy… histoire d’avoir plus de puissance et une carte 3D, ca pourrai servir de nos jours :lol:
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Avec PureASM vesion 2 Beta : :D

Code : Tout sélectionner

;/        Avec pointeur 
; Time1 = GetTickCount_() 
	CALL  _GetTickCount@0
	MOV    dword [v_Time1],eax
; For t=1 To 1000000 
	MOV    dword [v_t],1
_For1:
	MOV    eax,1000000
	CMP    eax,dword [v_t]
	JL    _Next2
; *PtrChaine.BYTE = @chaine + Longueur -1 
	MOV    eax,dword [v_chaine]
	MOV    ebx,eax
	ADD    ebx,dword [v_Longueur]
	ADD    ebx,-1
	MOV    dword [p_PtrChaine],ebx
; *PtrChaine1.BYTE = @chaine1 
	MOV    eax,dword [v_chaine1]
	MOV    dword [p_PtrChaine1],eax
; For p=0 To Longueur 
	MOV    dword [v_p],0
_For3:
	MOV    eax,dword [v_Longueur]
	CMP    eax,dword [v_p]
	JL    _Next4
; *PtrChaine1\b = *PtrChaine\b 
	MOV    ebp,dword [p_PtrChaine]
	MOVSX  eax,byte [ebp]
	MOV    ebp,dword [p_PtrChaine1]
	MOV    byte [ebp],al
; *PtrChaine1 + 1 
	INC    dword [p_PtrChaine1]
; *PtrChaine - 1 
	MOV    ebx,dword [p_PtrChaine]
	ADD    ebx,-1
	MOV    dword [p_PtrChaine],ebx
; Next 
_NextContinue4:
	INC    dword [v_p]
	JMP   _For3
_Next4:
; *PtrChaine1\b = 0 
	MOV    ebp,dword [p_PtrChaine1]
	MOV    byte [ebp],0
; Next 
_NextContinue2:
	INC    dword [v_t]
	JMP   _For1
_Next2:
;Debug chaine1 
; Time2 = GetTickCount_() 
	CALL  _GetTickCount@0
	MOV    dword [v_Time2],eax
On peut voir dans ce code que PureBasic perd du temps a chargé les pointeurs dans les registres puis inversement... Exemple flagrant :

Code : Tout sélectionner

; *PtrChaine - 1 
	MOV    ebx,dword [p_PtrChaine]
	ADD    ebx,-1
	MOV    dword [p_PtrChaine],ebx
qui se résume dans mon code ASM :

Code : Tout sélectionner

	DEC     edx 
Mais ce que je ne comprends pas, c'est pourquoi personne à le même coefficient de rapidité :?: apparemment, plus la configuration est grosse plus ce coefficient diminu...
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

J’ai fais le meme constat :
La code produit par PB a un caractere inévitablement générique.
Il est certainement plus difficile de l’adapter aussi bien que tu l’as fait,
car c’est une démarche d’optimisation du code.
Le cas « *PtrChaine – 1 » est de surcroit particulier a cause du « -1 » que tu remplaces par DEC.
Mais bon, c’est clair que meme sur un cas simple de pointeur, PB peut etre plus performant.


De meme pour ce qui est du ratio, c’est pas si trivial.
Cela doit dépend beaucoup de l’architecture des processeurs...
Par exemple Nico a un AMD et Comtois un Pentium 4 alors que moi je suis encore au PIII.

Sinon, à quand la version finale de PureASM 2 ???!! :)
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Cela doit dépend beaucoup de l’architecture des processeurs...
Par exemple Nico a un AMD et Comtois un Pentium 4 alors que moi je suis encore au PIII.
Oui, c'est la seul explication...
Sinon, à quand la version finale de PureASM 2 ???!!
Je travail beaucoup sur l'esthétique de PureASM, maintenant il y a un joli menu coloré, une joli toolbar, un joli panel et je travaille maintenant sur l'éditeur que je vais écrire entièrement (RichEdit et Scintilla ne me plaisent pas) je veux pouvoir mettre une texture sous le texte, voici une bidouille pour voir ce que ça donne

Code : Tout sélectionner

Enumeration
          #Window_0
          #Background1
          #Background2
          #Background3
EndEnumeration
#Visible = #True
#Invisible = #False
Global quit,hWnd,hBKBrush1,hBKBrush2,CurseurX,CurseurY,PositionX,PositionY,HauteurTexte
Global Timer,EtatCurseur,BKCurseurID

PositionX = 1
PositionY = 1

Procedure AfficheCurseur()
          hDC = GetDC_(hWnd) 
          If EtatCurseur = #Visible
                    UseImage(BKCurseurID) : DC_Curseur = StartDrawing(ImageOutput())
                    BitBlt_(DC_Curseur,0,0,2,HauteurTexte,hDC,CurseurX,CurseurY,#SrcCopy)
                    StopDrawing()
                    Pen = CreatePen_(0, 1, RGB(250, 250, 250))
                    SelectObject_(hDC, Pen)
                    MoveToEx_(hDC,CurseurX,CurseurY,0) : LineTo_(hDC,CurseurX,CurseurY+HauteurTexte)
                    MoveToEx_(hDC,CurseurX+1,CurseurY,0) : LineTo_(hDC,CurseurX+1,CurseurY+HauteurTexte)
                    DeleteObject_(Pen)
          Else
                    UseImage(BKCurseurID) : DC_Curseur = StartDrawing(ImageOutput())
                    BitBlt_(hDC,CurseurX,CurseurY,2,HauteurTexte,DC_Curseur,0,0,#SrcCopy)
                    StopDrawing()
          EndIf
          ReleaseDC_(hWnd,hDC) 
EndProcedure
Procedure WindowCallBack(WindowID, message, wParam, lParam) 
          Result = #PB_ProcessPureBasicEvents 
          Select message 
                    Case #WM_CHAR
                              If wParam = 13
                                        EtatCurseur = #Invisible : AfficheCurseur()
                                        CurseurX = 65
                                        CurseurY + HauteurTexte
                                        EtatCurseur = #Visible : AfficheCurseur()
                                        PositionX = 1 : PositionY + 1
                              ElseIf wParam = 8
                                        Debug "DEL"
                              Else
                                        EtatCurseur = #Invisible : AfficheCurseur()
                                        StartDrawing(WindowOutput())
                                        DrawingFont(LoadFont(0,"Verdana",12))
                                        FrontColor(100, 100, 200)
                                        DrawingMode(1)
                                        Locate(CurseurX,CurseurY)
                                        DrawText(Chr(wParam))
                                        CurseurX + TextLength(Chr(wParam)) 
                                        EtatCurseur = #Visible : AfficheCurseur()
                                        StopDrawing()
                              EndIf
          EndSelect 
          ProcedureReturn Result 
EndProcedure  
hWnd = OpenWindow(#Window_0, 0, 0, 800, 600, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible, "Texture") 
;/Créer l'image de fond de la fenêtre
hBackground1 = CreateImage(#Background1,100,40)
StartDrawing(ImageOutput())
For Y=0 To 40 Step 4        
          Line(0,Y,100,0,RGB(40,40,80))
          Line(0,Y+2,100,0,RGB(38,38,75))
          For t=0 To 100
                    If Random(100)>50 : Plot(t,Y+1,RGB(40,40,80)) : Plot(t,Y+3,RGB(40,40,80))
                    Else : Plot(t,Y+1,RGB(38,38,75)) : Plot(t,Y+3,RGB(38,38,75))
                    EndIf
          Next
Next
StopDrawing()
hBackground2 = CreateImage(#Background2,65,40)
StartDrawing(ImageOutput())
For Y=0 To 40 Step 4        
          For t=0 To 65
                    Plot(t,Y,RGB(40+t*2,80+t*2,120+t*2))
                    Plot(t,Y+2,RGB(38+t*2,75+t*2,112+t*2))
                    If Random(100)>50 : Plot(t,Y+1,RGB(40+t*2,80+t*2,120+t*2)) : Plot(t,Y+3,RGB(40+t*2,80+t*2,120+t*2))
                    Else : Plot(t,Y+1,RGB(38+t*2,75+t*2,112+t*2)) : Plot(t,Y+3,RGB(38+t*2,75+t*2,112+t*2))
                    EndIf
          Next
Next
StopDrawing()
hBKBrush1 = CreatePatternBrush_(hBackground1)
hBKBrush2 = CreatePatternBrush_(hBackground2)
hEcran = CreateImage(#Background3,800,600)
hDC = StartDrawing(ImageOutput())
SelectObject_(hDC, hBKBrush2)
Rectangle_(hDC,-1,0,65,600)
SelectObject_(hDC, hBKBrush1)
Rectangle_(hDC,64,-1,800,601)
StopDrawing()
hBrush = CreatePatternBrush_(hEcran)
SetClassLong_(hWnd, #GCL_HBRBACKGROUND, hBrush)
SetWindowCallback(@WindowCallBack()) 
HideWindow(0,0)
hDC = StartDrawing(WindowOutput())
DrawingFont(LoadFont(0,"Verdana",12))
PrevMapMode = SetMapMode_(hDC,#MM_TEXT) 
GetTextMetrics_(hDC,tm.TEXTMETRIC) 
If PrevMapMode : SetMapMode_(hDC,PrevMapMode) : EndIf 
HauteurTexte = tm\tmHeight
StopDrawing()
CurseurX = 65
CurseurY = 0
BKCurseurID = CreateImage(#PB_Any,2,HauteurTexte)
Timer = SetTimer_(WindowID(), 0, 600, 0)
;/
Repeat 
          EventID = WaitWindowEvent() 
          Select EventID
                    Case #WM_TIMER
                              If EtatCurseur = #Visible : EtatCurseur = #Invisible
                              Else : EtatCurseur = #Visible
                              EndIf
                              AfficheCurseur()
                    Case #PB_Event_CloseWindow : quit = #True
          EndSelect
Until quit
DeleteObject_(hBKBrush1) 
DeleteObject_(hBKBrush2) 
DeleteObject_(hBrush) 
bien sûr, l'utilisateur pourra choisir sa texture...
Cela va être long, je sortirai une version intermédiaire très bientôt :D
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Cool ! C'est prometteur… :D
Répondre