ART6 (4)







Testowanie szybkości






Testowanie
szybkości

Nudzisz się ??? Jeśli tak, to mam dla Ciebie zajęcie : potestuj sobie szybkość
różnych funkcji. Większość funcji API robi to samo, co odpowiedniki w VB, ale są
dużo szybsze. Jak jednak sprawdzić, czy dana dunkcja jest szybsza ??? Wystarczy, aby
została ona wykonana kilka tysięcy razy. Przed pętlą piszemy : FastX=Timer
potem piszemy nasz ciąg instrukcji (najlepiej, aby był
wykonywany z 10 sekund) a na końcu piszemy : MsgBox
Timer-FastX. Zmienna Timer, to zmienna przechowywująca ile
sekund upłynęło od północy. Najlepiej jest dany test wykonać np. 10 razy i policzyć
średnią (wyniki są zawsze nieco inne). Czekam na wasze porównania. Mam nadzieję, że
znajdziecie wiele instrukcji znacznie szybszych od standardowych. Podam poniżej 2
przykłady (instrukcja Pset + jej szybszy odpowiednik w API) i instrukcja Pset+Point (i
ich odpowiedniki w API).

Najpierw w module piszemy :
'Fast PSet
Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As
Long, ByVal y As Long, ByVal crColor As Long) As Long
'Fast Point
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As
Long, ByVal y As Long) As Long

Potem piszemy kod :
Dim SX As Long
Dim SY As Long

Private Sub Command1_Click()
y = Timer

For A = 0 To 300 * SX Step SX
For B = 0 To 300 * SY Step SY
Form1.PSet (A, B), RGB(64, 128, 255)
Next B
Next A

MsgBox Timer - y
End Sub

Private Sub Command2_Click()
Dim A As Single
Dim B As Single
y = Timer

For A = 0 To 300
For B = 0 To 300
x = SetPixel(Form1.hdc, A, B, RGB(255, 128, 64))
Next B
Next A

MsgBox Timer - y

End Sub

Private Sub Command3_Click()
Form1.Cls
End Sub

Private Sub Command4_Click()
Dim A As Single
Dim B As Single
y = Timer

For A = 0 To Picture1.Width Step SX
For BV = 0 To Picture1.Height Step SY
x = Picture1.Point(A, BV)
B = (x \ &H10000) And &HFF
G = (x \ &H100) And &HFF
R = x And &HFF
If R < 155 Then R = R + 100
If G < 155 Then G = G + 100
If B < 155 Then B = B + 100
Picture1.PSet (A, BV), RGB(R, G, B)
Next BV
Next A

MsgBox Timer - y
End Sub

Private Sub Command5_Click()
Dim A As Single
Dim B As Single
y = Timer

For A = 0 To Picture1.Width / SX
For BV = 0 To Picture1.Height / SY
x = GetPixel(Picture1.hdc, A, BV)
B = (x \ &H10000) And &HFF
G = (x \ &H100) And &HFF
R = x And &HFF
If R < 155 Then R = R + 100
If G < 155 Then G = G + 100
If B < 155 Then B = B + 100
x = SetPixel(Picture1.hdc, A, BV, RGB(R, G, B))
Next BV
Next A

MsgBox Timer - y

End Sub

Private Sub Command6_Click()
Picture1.Picture = Picture2.Picture
End Sub

Private Sub Form_Load()
Picture1.Picture = Picture2.Picture
SX = Screen.TwipsPerPixelX
SY = Screen.TwipsPerPixelY
End Sub

Wydaje się to skomplikowane, ale po naniesieniu tych 6-ciu Buttonów, 2 kontrolek
Picture (Picture2 musi zawierać jakiś rysunek, najlepiej o rozmiarze 100x200 pixeli) to
okaże się, że jest to proste jak drut. Najlpiej, jest ściągnąć ten sampel i nie musimy się męczyć.

Aby nie gmatwać głowy podam na koniec Odpowiedniki instrukcji Pset i Point, a program
to sobie sam potestujesz

Pset : X= SetPixel(Hdc, X, Y, kolor) -
funkcja zwraca wartość -1, gdy wystąpi jakiś błąd. W miejscu HDC piszemy np
Picture1.Hdc, Form1.Hdc itp. Kolor to kolor punktu (Logn, najłatwiej posłużyć się
instrukcją RGB)
Point : GetPixel(Hdc, X, Y) - Jest to
funkcja, która zwraca kolor koloru (Long).

A teraz prosta procedurka, która wydłubuje wartości R,G,B z funkcji RGB :
X=RGB(100,50,25)
B = (X \ &H10000) And &HFF
G = (X \ &H100) And &HFF
R = XAnd &HFF

To już tyle, pobaw się dołączonym samplem i spróbuj
znaleźć jakieś szybsze funkcje API od standardowych.

Jelcyn




Wyszukiwarka

Podobne podstrony:
ART6 (7)
art6
ART6 (13)
art6
art6
ART6 (14)
art6
art6
art6
ART6 (11)
art6

więcej podobnych podstron