Autor Zpráva
DeeDeeX
Profil
Zdravim vsechny,

potrebovala bych poradit s problemem, ktery mi pripada zahadny.
Mam stranku se zaznamy. Na kazdeho zaznamu je zobrazeny zamek. Kazde tri vteriny se u kazdeho zamku pomoci jquery zkontroluje, jestli je zamceny nebo odemceny a podle toho se vykresli ikona. Program jede v administraci, takze staci, pokud bude fungovat pro pocitace lidi, kteri v adminu pracuji.
U OS winXP je toto opakovane dotazovani prilis narocne na procesor, proto jsme se rozhodli, ze ikonu vykreslime u tohoto OS jen jednou. Ikona je v podstate informacni, ale rada bych, aby se pri nacteni pomoci js zobrazila.

var os = (function() {
    var ua = navigator.userAgent.toLowerCase();
    //alert(ua);
    return {
        isWin2K: /windows nt 5.0/.test(ua),
        isXP: /windows nt 5.1/.test(ua),
        isVista: /windows nt 6.0/.test(ua),
        isWin7: /windows nt 6.1/.test(ua)
    };
}());


var interval_id;
if(!os.isXP) {

   jQuery(".zamek_ico[name*=zam_]").load("inc_zamek.php?x="+ Math.random());
   jQuery(window).focus(function() {
         interval_id = setInterval(function() {
            jQuery(".zamek_ico[name*=zam_]").each(function (i) {
               var id_el = jQuery(this).attr("name");

               var id = parseInt(/zam_(\d+)/.exec(id_el)[1], 10);

            jQuery(".zamek_ico[name=zam_"+id+"]").load('inc_zamek.php?id='+id+'&x='+ Math.random());

         jQuery.ajaxSetup({ cache: false });
      });
      }, 3000);
   });

   jQuery(window).blur(function() {
      clearInterval(interval_id);
      interval_id = 0;
   });
}
if(os.isXP){
alert("is XP");
   jQuery(".zamek_ico[name*=zam_]").each(function (i) {
      var id_el = jQuery(this).attr("name");
      var id = parseInt(/zam_(\d+)/.exec(id_el)[1], 10);
      jQuery(".zamek_ico[name=zam_"+id+"]").load('inc_zamek.php?id='+id+'&x='+ Math.random());

      jQuery.ajaxSetup({ cache: false });
   });
}


Funkce funguje u ostatnich OS, ale u XP se spusti pouze alert("is XP");
a konec. Nespusti se jQuery(".zamek_ico[name*=zam_]").each(function (i) {

takze se OS sice rozezna, ale kod se na XP nespusti, i kdyz drive, kdyz jeste byla funkce jen jedna (nerozlisovaly se OS) mu tato cast kodu uvnitr SetInterval() co do funkcnosti problem nedelala.

Netusite prosim nekdo, kde by mohl byt problem?
Joker
Profil
DeeDeeX:
Není to tím, že chybí počáteční load (pro ne-XP se volá na ř. 16)?

Ale v první řadě bych řekl, že problém nebude v operačním systému, ale v prohlížeči. Nebo alespoň mě nenapadá, proč by skript v nějakém prohlížeči pod Windows XP měl být pomalejší, než ve stejném prohlížeči třeba pod Windows Vista. V takovém případě se celá ta detekce zaměřuje špatným směrem.

Možná by bylo jednodušší ten skript prostě zrychlit celkově:
• Odhadoval bych, že selektor .zamek_ico[name*=zam_] bude pomalý (hlavně právě ve starších prohlížečích), používá se třída zamek_ico i pro něco jiného? Nešlo by psát jen .zamek_ico? Nebo možná img.zamek_ico (jestli to lze takto omezit).
• Proč se jQuery.ajaxSetup({ cache: false }); volá při každém intervalu? To by mělo stačit zavolat jednou na začátku.
• Proč se prvky (navíc obrázky) identifikují přes name a ne přes id? Očekával bych, že volání jQuery("#zam_"+id) bude výrazně rychlejší, než jQuery(".zamek_ico[name=zam_"+id+"]")
var id = parseInt(/zam_(\d+)/.exec(id_el)[1], 10); Názvy předpokládám jsou typu zam_123 a tohle má vybrat to číslo. Nestačilo by var id = id_el.substring(4);? I to by mohlo skript trochu zrychlit.

Pak by to mohlo i ve starších prohlížečích fungovat přijatelně.
Dodatek: Jestli to závisí na prohlížeči a používá to jen určitá omezená skupina lidí, mohlo by být (i když ne právě ideální) řešení prostě změnit prohlížeč.
_es
Profil
DeeDeeX:
K čomu je to rozlišovanie OS dobré? Prečo by vôbec mala webová aplikácia rozlišovať medzi verziami OS? Čo iné prehliadače a iné OS ako Windows?
DeeDeeX
Profil
Děkuju Jokere, vyzkousim to postupne vsecko :-)

_es: nevim proc je to v XP pomalejsi, ale je. CPU jede v XP kazde ty tri vteriny na 100% a počítač hrabe a je zasekaný. Pravda je, že ve Firefoxu se to zdá být rychlejší než v IE, takže prohlížeč na to rozhodně vliv má. V ostatnich OS jede procesor v těch třívteřinových intervalech tak 50-60% a na rychlosti stránky se to nijek neprojeví. Jine OS než windows bohužel nikdo z nás nepoužívá, takže jsem to na nich netestovala.


Tak tím load na řádku 16 to nebylo. Skript pro XP se pořád nespouští. Ostatní úpravy jsem provedla a využití CPU je u XP co mam doma tak o 15-20% nizsi, uz to tedy nehrabe. Moc dík Jokere. Kdyby mi zítra ostatní řekli, že na jejich PC je porad problem, tak se ozvu, jestli nepujde doresit ten problem s nefunkcni casti kodu pro XP :-) Zatim teda jeste jednou dik :-)
_es
Profil
DeeDeeX:
CPU jede v XP kazde ty tri vteriny na 100% a počítač hrabe a je zasekaný.
Teda je aplikácia zle napísaná.
Koľko elementov vráti výraz jQuery(".zamek_ico[name*=zam_]")?
Prečo sa sťahujú dáta zo serveru pre každý extra a nie rozumne všetky naraz?
Udalosť focus môže teoreticky nastať viackrát za sebou - časovač nemusí byť vždy zrušenú udalosťou blur a môže potom bežať viacnásobne.
Prečo serverový skript nevráti len to, čo je treba a treba tak neefektívne vrátené dáta spracovávať?
Rozmyslela si si, čo všetko sa kedy zo servera sťahuje? - Metóda load je tam akosi veľa krát.
Joker
Profil
DeeDeeX:
nevim proc je to v XP pomalejsi, ale je.
Opravdu je to pod Windows XP pomalejší, než ve stejném prohlížeči (stejné verze) pod jinou verzí Windows?
A když se tam testují i Win2000, to je kód pod Windows XP pomalejší i proti Windows 2000?

_es:
Koľko elementov vráti výraz jQuery(".zamek_ico[name*=zam_]")?
Já bych od boku (jelikož nemáme bližší informace) tipoval, že slušná brzda bude už samotný ten dotaz. Hlavně v prohlížeči, který nemá nativně getElementsByClassName (tj. MSIE) předpokládám jQuery vybere všechny prvky na stránce a pak je analyzuje, což by mohl být důvod, proč „ve Firefoxu se to zdá být rychlejší než v IE“.

DeeDeeX:
ad _es, je pravda, že mnohem lepší by bylo něco takového:
1. Předpokládáme, že ten zámek má jen dva stavy (zamknutý, odemknutý). Udělal by se nejlépe jeden obrázek s oběma stavy.
2. Poslal by se AJAX dotaz na server, který by vrátil seznam stavů, něco jako: {"zam_1":0, "zam_2":1, "zam_3":1}
3. Na success by byla napojená funkce, která ten výčet projede a prvku s daným id nastaví odpovídající stav (stačila by CSS třída)

To by výrazně snížilo zátěž počítače, množství HTTP požadavků na server (místo každý interval jeden pro každý zámek by to bylo každý interval jeden) a dramaticky snížilo množství přenášených dat (místo obrázku pro každý zámek by se v každém intervalu přenesl jen jeden malý kousek JSON dat).
Ovšem vyžadovalo by to přepsat ten skript i protikus na straně serveru.
DeeDeeX
Profil
_es:
Udalosť focus môže teoreticky nastať viackrát za sebou - časovač nemusí byť vždy zrušenú udalosťou blur
Děkuju za podnět. Myslala jsem že blur se volá vždy, když okno ztratí fokus .. a že fokus může mít v jedné chvíli jen jedno okno. Podívám se na to. Můžu se zeptat, jak bys to řešil?
Koľko elementov vráti výraz jQuery(".zamek_ico[name*=zam_]")?
Je to min 20 max 50 záznamů na stránce.

Joker:
Opravdu je to pod Windows XP pomalejší, než ve stejném prohlížeči (stejné verze) pod jinou verzí Windows
Ano. Firefox je nejnovejsi verze ve win7 a winXP a v těch XP jsou problémy. Ale jedná se o různé počítače, je možné že to bude i slabším hardwarem. (I když u těch lidí z adminu si nemyslím, že mají hardware nějaký slabý. Nevím jaký mají procesor, ale RAMky mají 3GB, takž snad si počítače udržují. Tohle jim ale nespravuji a ani nemám možnost jim ten PC prohlížet)
Ten nápad s tím vracením dat ve formátu JSON je skvělý! Moc ti za něj díky. Nastuduju to a při chvilce to přepracuju :-)
Fakt Dík!
_es
Profil
DeeDeeX:
jak bys to řešil?
Jednoducho, pred zapnutím časovača zistiť, či je časovač zrušený.

Nastuduju to a při chvilce to přepracuju :-)
To ale netreba prerobiť „pri chvíľke“, ale si vyhradiť poriadny čas na prerobenie celej aplikácie od základov.
Joker
Profil
_es:
„jak bys to řešil?“
Jednoducho, pred zapnutím časovača zistiť, či je časovač zrušený
Anebo, kdyby se to dělalo tím AJAXovým mechanismem jak jsem popsal výše, stačilo by místo intervalu použít jen timeout, který by se nastavil vždycky při zpracování dat (nebo vypršení požadavku).
Čili na ukončení předchozího požadavku by se nastavil timeout na další požadavek. Přitom by stále byla možnost ten timeout zrušit při opuštění okna a obnovit na fokus. Nevýhoda by byla, že doba mezi jednotlivými požadavky by se mohla víc lišit (protože záleží i na rychlosti odpovědi od serveru), ale to by tady asi nebyl problém.
DeeDeeX
Profil
Děkuju moc oběma

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: