Article View: pl.comp.lang.vbasic
Article #92287Puste petle, The Test - VB.Net
From: Doker
Date: Fri, 21 Oct 2005 07:46
Date: Fri, 21 Oct 2005 07:46
160 lines
4199 bytes
4199 bytes
Postanowilem sprawdzić predkosc przetwarzania róznych pętli:
Dim m As Integer
For m = 1 To 500000000
Next
For i As Integer = 1 To 500000000
Next
Dim l As Integer
While l < 500000000
l += 1
End While
Dim k As Integer
Do While k < 500000000
k += 1
Loop
Dim j As Integer
Do Until j = 500000000
j += 1
Loop
(przez inner for oznaczam ta petle for ktora deklaruje iterator w swojej
kontrukji - petle z 'i',
przez outer petle 'm')
Pierwsze wyniki były ciekawe
-Debug-
outer for:1,875
inner for:1,859375
while:1,828125
do while:2,671875
do until:1,84375
-Release-
outer for:1,859375
inner for:2,359375
while:2,671875
do while:2,34375
do until:2,5625
W release prędkość spadla!
Dziwilo mnie zwlaszcza dlaczego do while jest wolniejsze od do until.
Postanowilem spradzic inne warunki dla while:
-Debug-
do while:2,6875 While Not k = 500000000
-Debug-
do while:2,671875 While k <> 500000000
Nadal zdecydowanie wolniej...
Co wiec moze być przyczyna?
Może kolejność w kodzie...?
Zaminiam petle while kolejnoscia z petla until
i coż, teraz until przyjmuje wyniki takie jak wczeniej while.
Mysle wiec, ze kompilator zarzadza pamiecia w calkiem sprytny sposob jednak nie
potrafi przewidziec kiedy pozbyc sie poprzedniej zmiennej.
Co wiec robie. Po kazdej petli wstawiam
m = nothing, pozniej
l = nothing ....
Dim l As Integer
While l < 500000000
l += 1
End While
l = nothing
Dim k As Integer
Do While k < 500000000
k += 1
Loop
k = nothing
I cóż to daje.
-Debug-
outer for:1,90625
inner for:2,6875
while:2,65625
do while:2,671875
do until:2,21875
Zupelnie nic. Nawet gorsze rezultaty.
Mysle, że pewnie takie podstawienie nothing nie robi tego co ja mysle...
sprobuje inaczej. Moze wyglada to mniej estetycznie i vbasickowo ale
sprobujemy.
zamiast l = nothing
wstawiam
GC.ReRegisterForFinalize(l)
i co uzyskuje?
-Debug-
outer for:1,84375
inner for:2,25
while:2,25
do while:1,84375
do until:1,859375
-Release-
outer for:1,859375
inner for:1,859375
while:2,578125
do while:2,640625
do until:2,65625
Dla porownania moje pierwsze wyniki:
-Debug-
outer for:1,875
inner for:1,859375
while:1,828125
do while:2,671875
do until:1,84375
-Release-
outer for:1,859375
inner for:2,359375
while:2,34375
do while:2,34375
do until:2,5625
Wiadomym jest i oczywistym, ze do badania czasu uzywam zmiennych double
.....
Next
t2 = DateAndTime.Timer
Dim l As Integer
While l <> 500000000
l += 1
....
Je tez postanowilem rejestrowac.
Wynik:
-Debug-
outer for:1,875
inner for:1,859375
while:2,234375
do while:1,828125
do until:2,21875
-Release-
outer for:1,875
inner for:1,875
while:2,546875
do while:2,828125
do until:2,65625
Szczerze mowiac nabralem tylko watpliwosci czy to rejestrowanie do finalizacji
dziala wogole na te zmienne.
W jakis sposob wydanie tego polecenia ma wplyw na prace petli, ale jaki tego
nie mam pojecia.
Widac jednak jak mala zmiana moze mocno wplynac na wydajnosc calego programu
jesli zawarty jest w petli...
Technical Details
Message-ID:
<dja6pb$17qh$1@node3.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.atman.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.atman.pl!not-for-mail From: "Doker" <doker0@wp.pl> Newsgroups: pl.comp.programming,pl.comp.lang.vbasic Subject: Puste petle, The Test - VB.Net Date: Fri, 21 Oct 2005 09:46:18 +0200 Organization: ATMAN Lines: 164 Message-ID: <dja6pb$17qh$1@node3.news.atman.pl> NNTP-Posting-Host: staticline3248.toya.net.pl Mime-Version: 1.0 X-Trace: node3.news.atman.pl 1129881195 40785 217.113.238.132 (21 Oct 2005 07:53:15 GMT) X-Complaints-To: abuse@atman.pl NNTP-Posting-Date: Fri, 21 Oct 2005 07:53:15 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2527 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2527 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit