2011-08-24 8 views
6

Oto fragment kodu od źródła jQuery (bit.ly/jqsource):powtarzane setTimeout() z 1 milisek

// The DOM ready check for Internet Explorer 
function doScrollCheck() { 
    if (jQuery.isReady) { 
     return; 
    } 

    try { 
     // If IE is used, use the trick by Diego Perini 
     // http://javascript.nwbox.com/IEContentLoaded/ 
     document.documentElement.doScroll("left"); 
    } catch(e) { 
     setTimeout(doScrollCheck, 1); 
     return; 
    } 

    // and execute any waiting functions 
    jQuery.ready(); 
} 

To jest hack do wykrycia, gdy DOM jest gotowy do IE. Chociaż teoretycznie wydaje się to bardzo piękne, jestem trochę zaniepokojony setTimeout(doScrollCheck, 1);, co oznacza, że ​​funkcja doScrollCheck() jest nazywana 1000 razy na sekundę, zanim DOM jest gotowy.

Czy powinienem się spodziewać, że będzie to ogromny spadek wydajności?

+0

Mam problem z zobaczeniem, jak to * nie * może być odpływem wydajności. Przynajmniej blokujesz przeglądarkę, co nigdy nie jest dobrym pomysłem. – Blazemonger

+1

Tak, to jest moje pytanie. Dlaczego * nie jest * to spadek wydajności? (Ponieważ zakładam, że ludzie jQuery wykonują tutaj dobrą robotę). – Randomblue

+4

IE ma (lub miał?) Minimalny czas 'setTimeout/setInterval' z czymś takim jak' 13ms', więc nie jest tak zły jak 1000 /druga. Więcej jak 77/sekundę. Ze wszystkich problemów związanych z wydajnością IE nigdy nie słyszałem skargi na '.ready()' jQuery, która jest poważnym drenażem. – user113716

Odpowiedz

3

Funkcja setTimeout jest prawie nigdy wywołana dokładnie w żądanym czasie. Przeglądarka może wykonać co najmniej +/- o kilka milisekund, a jeśli zajdzie jakakolwiek inna intensywna praca, może być opóźniona o sekund lub więcej. Jak już wspomnieli inni, przeglądarka implementuje również minimalny czas oczekiwania. Ta 1 milisekunda po prostu mówi przeglądarce "jak tylko skończysz robić cokolwiek robisz, daj mi znać, żebym mógł coś zrobić". Daje również egzekucję z Javascript, aby przeglądarka mogła wrócić do robienia tego, co zrobi dalej.

0

Nie sądzę, że tak jest - dopóki DOM nie będzie gotowy, użytkownik nie może już iterować ze stroną, a sprawdzanie co-1ms jest zatrzymywane, gdy tylko DOM zostanie przygotowany.

Co więcej, ta funkcja doScrollCheck to nie to samo co robi setInterval (doScrollCheck, 1). Te ostatnie nie czekają na zakończenie polecenia doScrollCheck, po prostu uruchomią funkcję doScrollCheck tak szybko, jak to możliwe - TO może być problem z wydajnością, ponieważ potencjalnie dziesiątki zachodzących na siebie wywołań do tej samej funkcji.

Nie jestem pewien, czy widziałem inny sposób wykrywania, że ​​DOM jest gotowy, sprawdzając dla coś (jest właściwość dostępna na documentElement w tym przypadku) w dłuższych/krótszych odstępach czasu.

+0

Przeglądarki nie domyślnie obsługują wielu środowisk JavaScript. Funkcja setTimeout nie zostanie wywołana, dopóki aktywny wątek javascript nie przyniesie minimalnego wykonania (zakończone przetwarzanie). – Zimzat

+0

Mówiąc o dziesiątkach nakładających się połączeń, odniosłem się do możliwych (choć niezalecanych pod względem wydajności) wykonywania czegoś w stylu 'setInterval (doScrollCheck, 1)'. W takim przypadku przeglądarka powinna co najmniej umieszczać w kolejce wywołania funkcji doScrollCheck podczas (jak wspomniano) ** podczas wykonywania ** pojedynczo. – WTK

+0

Myślę, że to, co masz na myśli, ale nie jest jasne, z tego co powiedziałeś, jest to, że jeśli wiele wywołań doScrollCheck() jest wykonywanych spoza tej funkcji, to co opisałeś, dzieje się. Jeśli funkcja doScrollCheck() zostanie wywołana tylko raz, problem, który opisujesz, nie nastąpi. Podejrzewam, że zaprogramowali dzwoniącego tej funkcji, aby temu zapobiec. – Zimzat

0

Minimalny limit czasu to znacznie więcej niż 1 milisekunda. Jeśli twój kod robił tam wiele manipulacji DOM, to nawet przy dłuższym okresie pauzy zacząłbyś rozgrzewać procesor.

Niektóre nowe przeglądarki (Firefox i Chrome, być może Safari) zwiększają ten minimalny limit czasu o wiele więcej w przypadku nieokreślonych kart i okien.

Nawet milisekunda to dobry pomysł na nowoczesny procesor.