2012-12-19 11 views
7

Poszukując sposobów na wyodrębnienie mojego kodu, zdarzyło mi się this jsPerf test. Nie spodziewając się niczego innego, jak tylko potwierdzić moją opinię o powolności funkcji, moje wyniki z IE 9 naprawdę rzuciły mi się na pętlę. Kod, który wykorzystywał wywołania funkcji, był szybszy, ale tylko w tej jednej przeglądarce. Przebiegłem to wiele razy z tym samym wynikiem. Nie widzę, że test został nieprawidłowo skonfigurowany. Co może być przyczyną tego dziwnego wyniku?IE działa szybciej z wywołaniami funkcji?

Mój agent użytkownika Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0 działa w systemie Windows Server 2008.

+0

Nieparzysty, IE 10 też tego nie robi. – vcsjones

+0

Właśnie potwierdziłem, że to tylko sprawa IE 9. Wypróbowałem to jeszcze raz na innym komputerze. –

+1

Czy proces zakładki był 32-bitowy czy 64-bitowy? Czy debugowanie skryptów zostało włączone lub wyłączone? Czy jest jakaś różnica, jeśli użyjesz * wyniku * testu (np. Zapobiegając optymalizacji całej rzeczy)? – EricLaw

Odpowiedz

4

Zastrzeżenie: jestem twórcą jsPerf.com.


pierwszego testu jest następująca:

var i = 0; 
for (i = 0; i < 1000; i++) { 
    test() 
} 

Dlaczego zawierać pętlę for tam? To tylko pochyla wynik. jsPerf automatycznie powtarza kod testowy, dopóki nie wykona wystarczającej liczby testów, aby uzyskać statystycznie istotny wynik. Najlepiej, jeśli testy jsPerf są tak kompaktowe, jak to możliwe, i testuj tylko to, co naprawdę chcesz przetestować. W tym przypadku nie interesuje Cię w ogóle wydajność pętli - wystarczy sprawdzić, czy wprowadzanie kodu jest szybsze niż wywoływanie funkcji, czy nie.

Jeśli są Państwo zainteresowani innymi wskazówkami dotyczącymi tworzenia solidnych przypadków testowych jsPerf, check out my #jsconfeu2011 presentation.

Uwaga: nie mówię, że zbędna pętla for jest powodem, dla którego widzisz ten wynik. Może to być czynnik, ale może być coś jeszcze, co dodatkowo przekreśla wynik. This might be IE9’s “dead code removal” feature kicking in.

W każdym razie rozwinąłem twój test jsPerf, usunąłem pętle i zmieniliśmy globalnie, aby uniknąć optymalizacji eliminacji martwych kodów. http://jsperf.com/function-calls-vs-inline/3 Czy możesz to sprawdzić w IE9? W tej chwili nie mam urządzenia wirtualnego IE9.

+0

Nie mam teraz dostępu do mojego komputera z IE9, ale może nawet bardziej dziwnie, Chrome działa teraz również szybciej dzięki funkcjom. –

+0

@TreyKeown: Interesujące, mogę odtworzyć wyniki w Chrome 28, ale nie w Chrome 30 Canary. Być może był to błąd w wersji v8 dostarczonej z Chrome 28. Coś podobnego działo się jakiś czas temu - w pewnym momencie wykonanie wyszukiwania zakresu było szybsze niż _nie_ wykonywanie wyszukiwania zakresu w wersji 8: http://jsperf.com/ zakres wyszukiwania –