SharedObject - optimalizace výkonu
Neděle, Březen 29th, 2009V 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; }




Pokud se v MovieClipu objekt_2 odkážeme na nadřazený objekt, dostaneme zpět referenci na objekt_1. Jak to bude vypadat z opačného směru při parsování pomocí AS3?: