SharedObject - optimalizace výkonu

V jednom z dokončovaných projektů jsem zjistil zbytečnou zátěž procesoru, která na první pohled neměla žádný rozumný důvod. Profilování ve Flex Builderu také nehlásilo nic neobvyklého a tak musela na řadu přijít klasická metoda reverzního odhalování kritického místa, kterým se nakonec ukázalo použití třídy SharedObject.

Problémem se ukázalo časté dotazování na uložená data, při kterém se v každém novém dotazu vytvářela nová instance třídy SharedObject. Došel jsem k celkem zajímavým výsledkům, kdy například dva dotazy najednou zabraly zhruba 16ms, čtyři už asi 31ms atd. To je pro chod běžných aplikací nepřijatelné. Naštěstí je řešení vcelku jednoduché - nevytvářet pokaždé novou instanci, ale využívat jednu, předem vytvořenou.

Data do SharedObjectu vypadají takto:

var sharedObj:SharedObject = SharedObject.getLocal("myData");
sharedObj.data.nfo = "text";
sharedObj.flush();

A problémový skript pak vypadá následovně:

function getSoData():String {
    var sObj:SharedObject = SharedObject.getLocal("myData");
    var str:String = sObj.data.nfo;
    return str;
}
function testSharedData(count:uint):void {
    var dat:Date = new Date();
    var ms:Number = dat.getTime();
    for (var i:uint=0; i<count; i++) {
        trace(getSoData());
    }
    var dat2:Date = new Date();
    var dif:Number = dat2.getTime()-ms;
    trace("Čas výpočtu: "+dif+"ms");
}
testSharedData(10);

Po spuštění deseti dotazů na SharedObject třídu se dostaneme k délce trvání zhruba 63ms

Upravená funkce pro získání dat pak využívá předem vytvořenou instanci SharedObject třídy a na výkonu je to citelně znát, uvedený čas je 0ms:

var sharedObj:SharedObject = SharedObject.getLocal("myData");
function getSoData():String {
    var str:String = sharedObj.data.nfo;
    return str;
}

Leave a Reply

Captcha
Enter the letters you see above. (Case sensitive)