Hát lefuttattam én is pár tesztet aminek az eredményét közlöm nem sokára és elég érdekes dolog lesz a végeredménye:
Kezdetnek itt a script amivel vizsgálom:
[pawn]
#include <a_samp>
/*
A tesztnél törekedtem arra hogy az egyik vizsgált funkció ugyanannyiszor fusson le mint a másik,
kinézetre hasonló legyen mind a kettõ.
*/
#define ISMETLODESERTEK 5000 // Egy vizsgált mûveletet többször kell lefuttatni ahhoz hogy mérhetõ idõbeli különbséget kapjunk,
// ennek az ismetlõdésnek a lefuttatott tesztek során nõvelhetjük vagy csökkenthetjük tetszés szerint az értékét
// értelem szerûen ha egy vizsgált kód vagy kód sorozat kevés(rövid kinek hogy tetszik) akkor sokkal több ismétlõdésre van szükség akár 1 millio is
// ahhoz hogy látható mérési eredményt kapjunk.
stock
forteszt()
{
new
count = 0, // Változó azért hogy tudjuk ellenõrízni hogy mind a két vizsgált kód ugyanannyiszor ismétlõdõtt-e?
loop = 0;
for(new i; i < ISMETLODESERTEK; i++) // Többszörös ismétlõdés azért hogy mérhetõ idõbeli különbséget kapjunk.
{
// A vizsgálandó kód:
loop = 0;
for( ; loop < ISMETLODESERTEK; )
{
loop++;
count++;
}
//
}
return count;
}
stock
whileteszt()
{
new
count = 0, // Változó azért hogy tudjuk ellenõrízni hogy mind a két vizsgált kód ugyanannyiszor ismétlõdõtt-e?
loop = 0;
for(new i; i < ISMETLODESERTEK; i++) // Többszörös ismétlõdés azért hogy mérhetõ idõbeli különbséget kapjunk.
{
// A vizsgálandó kód:
loop = 0; // Itt nullázva a ciklus léptetésének változója azért hogy minden egyes alkalommal végig fusson.
while(loop < ISMETLODESERTEK)
{
loop++;
count++;
}
//
}
return count;
}
public
OnFilterScriptInit()
{
// És hogy még biztosabb eredményt kapjunk érdemes még ezt az egészet is többször lefuttatni mondjuk 5 alkalommal
for(new t; t < 5; t++)
{
printf(\"[----------------------------------------------------------]\");
printf(\"Az egész vizsgálat többszöri lefutása %d. alkalommal.\", t + 1);
printf(\" \");
new time; // Az eltelt idõ kiszámításához szükséges változó
new count; // A tesztelt dolgok ismétlõdésének ellenõrzésének változója
//------
time = GetTickCount(); // vizsgálat kezdetének ideje tárolva time változóban.
count = whileteszt(); // A tesztelt funkció
time = GetTickCount() - time; printf(\"while ciklus ideje: %dms | Ismétlõdések száma: %d\", time, count); // Teszt lefutásának vége az eltelt idõ kiszámítása eredmény kiírása konzolba
//------
time = GetTickCount();
count = forteszt(); // A tesztelt funkció
time = GetTickCount() - time; printf(\"for ciklus ideje: %dms | Ismétlõdések száma: %d\", time, count); // Teszt lefutásának vége az eltelt idõ kiszámítása eredmény kiírása konzolba
//------
time = GetTickCount();
count = forteszt(); // A tesztelt funkció
time = GetTickCount() - time; printf(\"for ciklus ideje: %dms | Ismétlõdések száma: %d\", time, count); // Teszt lefutásának vége az eltelt idõ kiszámítása eredmény kiírása konzolba
//------
time = GetTickCount();
count = whileteszt(); // A tesztelt funkció
time = GetTickCount() - time; printf(\"while ciklus ideje: %dms | Ismétlõdések száma: %d\", time, count); // Teszt lefutásának vége az eltelt idõ kiszámítása eredmény kiírása konzolba
//------
printf(\" \");
}
}
[/pawn]
És az eredmény:
[18:10:09] Az egész vizsgálat többszöri lefutása 1. alkalommal.
[18:10:09]
[18:10:12] while ciklus ideje: 3022ms | Ismétlõdések száma: 25000000
[18:10:15] for ciklus ideje: 2979ms | Ismétlõdések száma: 25000000
[18:10:18] for ciklus ideje: 3046ms | Ismétlõdések száma: 25000000
[18:10:21] while ciklus ideje: 2955ms | Ismétlõdések száma: 25000000
[18:10:21]
[18:10:21] [----------------------------------------------------------]
[18:10:21] Az egész vizsgálat többszöri lefutása 2. alkalommal.
[18:10:21]
[18:10:24] while ciklus ideje: 3061ms | Ismétlõdések száma: 25000000
[18:10:27] for ciklus ideje: 3013ms | Ismétlõdések száma: 25000000
[18:10:31] for ciklus ideje: 3464ms | Ismétlõdések száma: 25000000
[18:10:34] while ciklus ideje: 3002ms | Ismétlõdések száma: 25000000
[18:10:34]
[18:10:34] [----------------------------------------------------------]
[18:10:34] Az egész vizsgálat többszöri lefutása 3. alkalommal.
[18:10:34]
[18:10:37] while ciklus ideje: 2970ms | Ismétlõdések száma: 25000000
[18:10:40] for ciklus ideje: 2981ms | Ismétlõdések száma: 25000000
[18:10:43] for ciklus ideje: 2982ms | Ismétlõdések száma: 25000000
[18:10:46] while ciklus ideje: 2971ms | Ismétlõdések száma: 25000000
[18:10:46]
[18:10:46] [----------------------------------------------------------]
[18:10:46] Az egész vizsgálat többszöri lefutása 4. alkalommal.
[18:10:46]
[18:10:49] while ciklus ideje: 2981ms | Ismétlõdések száma: 25000000
[18:10:52] for ciklus ideje: 3071ms | Ismétlõdések száma: 25000000
[18:10:55] for ciklus ideje: 3129ms | Ismétlõdések száma: 25000000
[18:10:58] while ciklus ideje: 3178ms | Ismétlõdések száma: 25000000
[18:10:58]
[18:10:58] [----------------------------------------------------------]
[18:10:58] Az egész vizsgálat többszöri lefutása 5. alkalommal.
[18:10:58]
[18:11:01] while ciklus ideje: 3088ms | Ismétlõdések száma: 25000000
[18:11:04] for ciklus ideje: 3111ms | Ismétlõdések száma: 25000000
[18:11:07] for ciklus ideje: 2968ms | Ismétlõdések száma: 25000000
[18:11:10] while ciklus ideje: 3017ms | Ismétlõdések száma: 25000000
Ezután csak a tesztelt ciklus képletet és az eredményt közlöm.
Edit1:
[pawn]
//
loop = 0;
while(loop++ != ISMETLODESERTEK) {count++;}
//
loop = 0;
for(; loop++ != ISMETLODESERTEK;) {count++;}
//
//[18:28:53] while ciklus ideje: 1818ms | Ismétlõdések száma: 25000000
//[18:28:55] for ciklus ideje: 1801ms | Ismétlõdések száma: 25000000
[/pawn]
Edit2:
[pawn]
//
loop = 0;
while(loop != ISMETLODESERTEK) {loop++; count++;}
//
loop = 0;
for(; loop != ISMETLODESERTEK;) {loop++; count++;}
//
//[18:34:13] while ciklus ideje: 2541ms | Ismétlõdések száma: 25000000
//[18:34:15] for ciklus ideje: 2524ms | Ismétlõdések száma: 25000000
[/pawn]
Hát szóval én arra a következtetésre jutottam hogy nem igazán lehet eldönteni melyik ciklus utasítás gyorsabb különbözõ féle képpen lehet megírni õket és elég nagy eltéréseket lehet mérni köztük.
Annyi bizonyossá vált számomra hogy ha a ciklus utasításban magában a feltétel vizsgálatban van kiadva a változó értékének növelése, jóval gyorsabb lefutási idejû kódot kapunk. while(loop++ != ISMETLODESERTEK)
for(; loop++ != ISMETLODESERTEK;)
[/quote]