PDA

Volledige versie bekijken : Snelle even/oneven test


kH_
%Europe/Berlin %500 %2005, 13:01
Hierbij een super klein stukkie code om te kijken of een getal even of oneven is:

function isOneven(num:Number):Boolean
{
return Boolean(num&1);
}

function isEven(num:Number):Boolean
{
return !(num&1);
}

Misschien dat dit iemand eens van pas komt. Je ziet namelijk vaak code als 'if((num%2)==0)', maar dat is vele malen trager. Van een even getal is namelijk de meest rechter bit ALTIJD 0 en voor oneven ALTIJD 1. En het testen van een bit (een AND,OR,XOR etc.) is de snelste instructie die er is.

Roenes
%Europe/Berlin %712 %2005, 18:05
Mooi stukje code :)

Kan ik vrij weinig op aanmerken. Volgens mij valt er niet veel aan te verbeteren :)

kH_
%Europe/Berlin %759 %2005, 19:14
Idd, knap als je 1 regeltje code kunt optimaliseren :)

Roenes
%Europe/Berlin %760 %2005, 19:14
Idd, knap als je 1 regeltje code kunt optimaliseren :)Zeg nooit nooit ;)

//Edit
In feite heb jij dat ook gedaan: de modulo manier geoptimaliseerd naar dit ;)

kH_
%Europe/Berlin %853 %2005, 21:28
Das waar :D

Folkert
%Europe/Berlin %558 %2005, 14:24
eh

var b = 121012.3;

trace(isEven(b));


geeft true ;) net als bv 12.3

kH_
%Europe/Berlin %824 %2005, 20:47
het werk ook op integers he ;)

Heb je ooit wel eens een even of oneven gebroken getal gezien :D

Folkert
%Europe/Berlin %921 %2005, 23:07
Heb je ooit wel eens een even of oneven gebroken getal gezien :D
tot vanmiddag niet nee :P zou dan dus toch false moeten returnen lijkt me. Dat doet de getal%2 == 0 immers ook ;)

kH_
%Europe/Berlin %642 %2005, 16:25
BOEIEND!!!

Je moet die functie gewoon gebruiken waarvoor hij bedoeld is. Extra checks inbouwen is alleen maar trager en helemaal NERGENS voor nodig. Als 1 of andere kloothommel de functie niet weet te gebruiken, dan koopt ie eerst maar een goed programmeerboek ofzo...

Sorry, maar van dit soort reacties word ik een BEETJE geprikkeld.

Tha Narie
%Europe/Berlin %829 %2005, 20:54
Sorry hoor, maar meneer Folkert heeft hier gewoon gelijk! ;)
Maar jij daarintegen ook.

In ieder geval geen reden om op die manier te reageren, dus beetje chill!

Folkert
%Europe/Berlin %833 %2005, 21:00
kh_ dat kloothommel had je vast niet tegen mij wel ?
zo wel, post dan geen oplossingen of antwoorden meer, als je op of aanmerkingen niet aankan.

Je suggereerd immers zelf in je post dat het de modulo vervangt. Wel, ik wijs je er enkel (en zonder aanval of wat dan ook in mind) op dat de uitkomst niet overeenkomt met die van de modulo.
Voor hele getallen zonder decimalen een prima oplossing echter dat haal ik niet uit je post;)

kH_
%Europe/Berlin %487 %2005, 12:41
Nee hoor, dat kloothommel had ik niet tegen jou :D

Ik suggereer btw niet dat de code de modulo vervangt trouwens. Ik suggereer helemaal geen ene ruk, duzz...
Maareh, kijk....dit soort reacties zit ik gewoon niet op te wachten. Nu moet ik me gaan verdedigen enzo en daar heb ik helemaal geen zin in. Ik vind het juist vervelend, als posts dusdanig worden bekeken, dat mensen gaan kijken of ze de poster ook kunnen betrappen op een foutje (daar lijkt dit erg op).
En het is allemaal best, ik kom toch de eerste tijd niet meer op dit forum, aangezien ik daar geen tijd meer voor heb.

Discussieer over de CODE en NIET over de manier, waarop ik iets neerzet!!!!!!!!!!!!!!!!!

Tha Narie
%Europe/Berlin %494 %2005, 12:52
Nu moet ik me gaan verdedigen enzo en daar heb ik helemaal geen zin in.
Daar is dit forum juist voor.
- iemand post een mooi stukje AS
- anderen kijken hoe het werkt, verdiepen zich erin en geven commentaar
- jij kijkt naar het commetaar, en leert er misschien ook nog iets van.

Jij zit blijkbaar alleen op reacties te wachten als 'leuk', 'mooi', enz. Als dat zo is, zit je hier inderdaad verkeerd.
Ik ben blij dat er nog mensen zitten die zich bezig houden met de code en nuttige feedback geven, anders zou het hier een dooie boel zijn!

Ik vind het juist vervelend, als posts dusdanig worden bekeken, dat mensen gaan kijken of ze de poster ook kunnen betrappen op een foutje (daar lijkt dit erg op).
Nee, mensen kijken of er in de code een foutje zit!~
Stel dat er een echte fout in jouw code zat, dan zou je toch ook willen dat iemand dat op zou merken?

En nogmaals, een beetje rustig aan in je reacties, jij voelt je aangevallen en gaat anderen aanvallen, maar dat is helemaal nergens voor nodig!

kH_
%Europe/Berlin %497 %2005, 12:56
Ik zit helemaal niet op reacties als leuk en mooi en ow wat ben je goed te wachten, maar ik word snel chagrijnig hoor :D

Laat ik dit zeggen:

isEven("blabla");
Goh, geeft een compilatie fout!

Tha Narie
%Europe/Berlin %500 %2005, 13:00
Als Flash nou het verschil tussen Integers en Floats wist, zou het hele probleem opgelost zijn.

Folkert
%Europe/Berlin %509 %2005, 13:13
Ik val je nergens aan, dus dat je je moet verdedigen is onzin. Wel denk ik dat je er wijs aan doet niet zomaar mensen (mij in dit geval) uit te gaan schelden, zonder dat je ook maar een idee hebt van wie er tegenover je staat ;)
Daarbij is het jammer dat je niet in staat blijkt te zijn het gaatje in je functie (waar ik je dus op wijs) te zien als een potentieel verwarrend iets, immers getallen kunnen echt gewoon decimalen bevatten. Wat narie net nog zegt, als er dan verschil zou zijn tussen floats en integers, zouden we deze topic niet zo lang hoeven maken.
Verder had ik al aangegeven, als je niet in staat bent reacties te ontvangen of niet in staat bent deze op normale waarde te schatten, post of reageer dan gewoon niet.
Het mag toch niet zo zijn als ik een normale geldige aanvulling doe, dat ik dan uitgescholden word en dat mijnheer de poster alsnog even zijn gram wil halen door isevenn("string") te geven, waarmee je overigens wat mij betreft duidelijk aangeeft niet te begrijpen welk punt ik uberhaupt maak.
groeten en hopelijk voor jou wat minder stress.

kH_
%Europe/Berlin %513 %2005, 13:19
Om even de zaak aan mijn kant af te ronden:

Ik scheld niemand uit en vervolgens, je weet ook niet wie ik ben!
Verder, ik ben helemaal niet iemand die snel agressief wordt, maar juist graag dingen mag uitleggen. Aan de andere kant kan ik wel snel agressief worden, op basis van de eerste reacties. Dat komt door het feit, dat ik teveel in mijn dagelijkse leven meemaak, hoe vaak mensen mij proberen te betrappen op een foutje. Ik kan daar ook niet meer goed tegen zonder uit mijn slof te schieten.
Maar ik heb niemand zitten uitschelden, laat dat wel even erg duidelijk zijn!!

Folkert
%Europe/Berlin %517 %2005, 13:24
check je pm kh_ ;) de topic is zo wel genoeg off topic lijkt me.

kH_
%Europe/Berlin %523 %2005, 13:33
Laatste reactie (die ik ook naar Folkert heb gestuurd):

Beste Folkert,

Ik zal het bij dezen even nader uitleggen dan:
Eerlijk gezegd weet ik niet eens waarom ik zo heb zitten reageren. Ik heb eigenlijk een beetje impulsief zitten reageren. Ik ben de laatste tijd een beetje chagrijnig wegens het niet goed in mijn vel zitten enzo, maar dat geeft mij inderdaad geen reden om zo dom te reageren eigenlijk. Ik zeg gewoon sorry, ik zal mijzelf een flinke mep verkopen en ik houd mij even een tijd lang stil.
Ik ben hier erg fout bezig en moet gewoon op een normale manier met iedereen kunnen discussieren en zo is het. Ik kom alleen zo vaak mensen tegen die mij onder de tafel proberen te lullen (maar technisch totaal geen ruk kunnen) en doordat ik beter op papier communiceer lukt dat ook wel vaak, maarja....ik denk dat ik daardoor onbewust wat geprikkelder ben geworden ofzo.
Het zal in ieder geval niet meer voorkomen (hoop ik).

Groeten,

kH_

Folkert
%Europe/Berlin %532 %2005, 13:46
Zoals al via pm gezegd, niet wegblijven hier van het forum want dat zou teveel mensen benadelen. Je bent van grote waarde inmiddels allang gebleken.
Over code, en hoe het wel en niet geschreven zou moeten daarover zullen we hopelijk nooit uitgediscuseerd raken. Daar is het way te mooi en waardevol voor. En voor de kloothommels :-D even een aanvulling.

function isOneven(num:Number):Boolean
{
var ret = (int(num) == num) ? num & 1 : false;
return Boolean(ret);
}

function isEven(num:Number):Boolean
{
var ret = (int(num) == num) ? !(num & 1) : false;
return Boolean(ret);
}

kH_
%Europe/Berlin %547 %2005, 14:08
We hebben het iig uitgepraat ;)

En ok, ik geef het toe....deze aanvulling is inderdaad een gewenste aanvulling :)
Ik vraag me nu nog wel af, wat zou in dit geval sneller zijn, de modulus, of de aangevulde AND versie? Ik denk nu nog steeds de AND :)

Folkert
%Europe/Berlin %575 %2005, 14:48
eh modulo is factor 3 sneller ;)

als ik een loop van 10000 laat lopen met

var bla = "a is "+isEven(a)+", b is "+isEven(b);


tegen 10000

var bla = "a is "+(a%2==0)+", b is "+(b%2==0);


Dan is het gemiddeld dus factor 3 sneller (de modulo) komt rond de 600 millisec en de isEven komt rond de 1600 millisec uit. dus we moeten even terug naar de tekentafel om er wat meer snelheid uit te persen, dat was immers het doel van de functie. Bij the way bij nadere testen blijkt de orginele functie ook de helft langzamer te zijn dan de modulo ;)

kH_
%Europe/Berlin %581 %2005, 14:57
Ja ok, maar daar zit je al met de function call naar isEven, dat scheelt natuurlijk ook heel wat. Om een goede vergelijking te maken moet je de isEven ook inline schrijven, of van de modulo ook een aparte functie maken :)

Folkert
%Europe/Berlin %594 %2005, 15:15
Ja ok, maar daar zit je al met de function call naar isEven, dat scheelt natuurlijk ook heel wat. Om een goede vergelijking te maken moet je de isEven ook inline schrijven, of van de modulo ook een aparte functie maken :)

Wanneer je dat doet word het verschil wel een heel stuk minder inderdaad, alleen zie ik zelf daar dan de logica en het nut niet van. immers de modulo is rechtstreeks als condition te gebruiken. Wanneer de modulo ook in een functie staat met een Boolean returntype dan is het verschil nog een 200 millisec max ;)

kH_
%Europe/Berlin %598 %2005, 15:21
Hmmz, ik begin nu het idee te krijgen, dat mijn bewering een beetje onjuist wordt (modulo is gewoon sneller). In theorie moet de AND sneller zijn echter. In assembly is dat zeker zo. Misschien als gebruik in de tertiaire operator is hij wel sneller.

kH_
%Europe/Berlin %608 %2005, 15:35
Ze zijn exact even snel in Flash. Zie hier de test die ik gemaakt heb:

var dateStart:Date;
var dateEnd:Date;

function beginTiming():Void
{
dateStart=new Date();
trace(dateStart.getHours()+":"+dateStart.getMinutes()+":"+dateStart.getSeconds()+":"+dateStart.getMilliseconds());
}
function endTiming():Void
{
dateEnd=new Date();
trace(dateEnd.getHours()+":"+dateEnd.getMinutes()+":"+dateEnd.getSeconds()+":"+dateEnd.getMilliseconds());
trace("MILLISECONDS DIFFERENCE: "+((dateEnd.getMilliseconds()-dateStart.getMilliseconds())>0?(dateEnd.getMilliseconds()-dateStart.getMilliseconds()):1000+(dateEnd.getMill iseconds()-dateStart.getMilliseconds())));
}

trace("TIMING AND FUNCTION...");
beginTiming();
for(var i=0;i<20000;i++)
{
//isEven
var bResult:Boolean=((i&1)==0);
}
endTiming();
trace("TIMING MODULO FUNCTION...");
beginTiming();
for(var i=0;i<20000;i++)
{
//isEven
var bResult:Boolean=((i%2)==0);
}
endTiming();
En hier het resultaat:
TIMING AND FUNCTION...
14:35:24:187
14:35:24:265
MILLISECONDS DIFFERENCE: 78
TIMING MODULO FUNCTION...
14:35:24:265
14:35:24:343
MILLISECONDS DIFFERENCE: 78

Roenes
%Europe/Berlin %608 %2005, 15:36
Kan het converteren naar een boolean niet erg traag zijn? Want dat is weer een extra stap die de modulo niet hoeft te maken (of het gebeurt intern) :)

kH_
%Europe/Berlin %610 %2005, 15:38
Klopt, daarom heb ik de functie aangepast. Werkt nu exact hetzelfde als de modulo.
Het kan best dat de Flash optimizer naar de conversie naar native code een modulo 2 gewoon vervangt door een logische AND. Hmmm....het onderzoeken waard :)

Folkert
%Europe/Berlin %619 %2005, 15:52
zonder vfunctie call liggen zijn de verschillen inderdaad verwaarloosbaar. als je die test een keer of 20 uitvoerd zal je zien, ene keer gelijk andere keer net voordeel voor modulo en weer andere keer net voordeel voor jou oplossing.
zet je beiden in functies, of doe je de int check erbij dan is het verschil in het voordeel van de modulo. Hebben we mooi wel wat van geleerd weer.

kH_
%Europe/Berlin %650 %2005, 16:36
Inderdaad ja. Maar toch is het nog steeds de vraag op welke manier de AND functie naar native code wordt vertaald. Een AND moet namelijk altijd sneller zijn dan een modulo, aangezien een AND de meest eenvoudige operatie is voor een CPU (aangezien een CPU alleen maar is opgebouwd uit hele reeksen van logische poorten).