Bitwise operacije
Brza integer matematika
Disclaimer: Iako u ovoj rubrici nije u listi ActionScript 3, poÅ¡to ima sliÄnosti sa JS-om i skripting je jezik, mislim da je dozvoljeno postati ovaj tutorijal u ovoj rubrici.
Bitwise operacije su izuzetno brze u AS3, i u slijedecem dijelu se nalaze kodovi koji mogu ubrzati odreÄ'ene proraÄune. Ovdje neću objaÅ¡njavati Å¡ta su bit operatori i kako ih koristiti, za to cu napisati poseban tutorijal za C programski jezik. Svi testovi za performanse (a.k.a benchmark) su uraÄ'eni u AS3.
Shiftanje lijevog bita za mnozenje bilo kojim stepenom dvojke (298% brže)
x = x * 2;
x = x * 64;
/* jednako */
x = x << 1;
x = x << 6;
Shiftanje desnog bita za dijeljenje bilo kojim stepenom dvojke ( 350,4% brže )
x = x / 2;
x = x / 64;
/* jednako */
x = x >> 1;
x = x >> 6;
Konverzija number u integer ( int(x) je 10% brže od bitwise u AS3, dok u AS2 to nije sluÄaj )
x = int(1.232)
/* jednako */
x = 1.232 >> 0;
Ekstrakcija komponenti boja ( nije baš trik, nego regularan metod ekstrakcije vrijednosti bitwise maskiranjem i shiftanjem )
//24bit
var color:uint = 0x336699;
var r:uint = color >> 16;
var g:uint = color >> 8 & 0xFF;
var b:uint = color & 0xFF;
//32bit
var color:uint = 0xff336699;
var a:uint = color >>> 24;
var r:uint = color >>> 16 & 0xFF;
var g:uint = color >>> 8 & 0xFF;
var b:uint = color & 0xFF;
Kombinacija komponenti boja
//24bit
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = r << 16 | g << 8 | b;
//32bit
var a:uint = 0xff;
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = a << 24 | r << 16 | g << 8 | b;
Zamjena integera bez pomocne varijable korištenjem XOR logike ( 20% brže, radi i u C++ i C )
var t:int = a;
a = b;
b = t;
/* jednako */
a ^= b;
b ^= a;
a ^= b;
Mijenjanje predznaka korištenjem NOT i XOR logike ( oko ~300% brže )
i = -i;
/* jednako */
i = ~i + 1;
/ * ili */
i = (i ^ -1) + 1;
Provjera da li je broj paran ili nije korištenjem bitwise AND logikom ( ~600% brže )
isEven = (i % 2) == 0;
/* jednako */
isEven = (i & 1) == 0;
Mnogi od ovih kodova rade i u C/C++, zbog slicnosti operatorske logike. Treba imati na umu da su ovo stvari koji otežavaju Äitljivost i održavanje koda, te ih treba nekada i izbjegavati.