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:

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

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

  1. function getSoData():String {
  2.     var sObj:SharedObject = SharedObject.getLocal("myData");
  3.     var str:String = sObj.data.nfo;
  4.     return str;
  5. }
  6. function testSharedData(count:uint):void {
  7.     var dat:Date = new Date();
  8.     var ms:Number = dat.getTime();
  9.     for (var i:uint=0; i<count; i++) {
  10.         trace(getSoData());
  11.     }
  12.     var dat2:Date = new Date();
  13.     var dif:Number = dat2.getTime()-ms;
  14.     trace("Čas výpočtu: "+dif+"ms");
  15. }
  16. 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:

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